web-dev-qa-db-ja.com

reshape2メルト警告メッセージ

meltを使用していますが、次の警告メッセージが表示されます。
attributes are not identical across measure variables; they will be dropped

周りを見て回った後、それは変数が異なるクラスだからです。ただし、私のデータセットではそうではありません。

データセットは次のとおりです。

test <- structure(list(park = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("miss", "piro", "sacn", "slbe"), class = "factor"), 
    a1.one = structure(c(3L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 
    3L), .Label = c("agriculture", "beaver", "development", "flooding", 
    "forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90", 
    "none"), class = "factor"), a2.one = structure(c(6L, 6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("development", 
    "forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90", 
    "none"), class = "factor"), a3.one = structure(c(3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("forest_pathogen", 
    "harvest_00_20", "none"), class = "factor"), a1.two = structure(c(3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("agriculture", 
    "beaver", "development", "flooding", "forest_pathogen", "harvest_00_20", 
    "harvest_30_60", "harvest_70_90", "none"), class = "factor"), 
    a2.two = structure(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
    6L), .Label = c("development", "forest_pathogen", "harvest_00_20", 
    "harvest_30_60", "harvest_70_90", "none"), class = "factor"), 
    a3.two = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L), .Label = c("forest_pathogen", "harvest_00_20", "none"
    ), class = "factor")), .Names = c("park", "a1.one", "a2.one", 
"a3.one", "a1.two", "a2.two", "a3.two"), row.names = c(NA, 10L
), class = "data.frame")

そして、構造は次のとおりです。

str(test)
'data.frame':   10 obs. of  7 variables:
 $ park  : Factor w/ 4 levels "miss","piro",..: 1 1 1 1 1 1 1 1 1 1
 $ a1.one: Factor w/ 9 levels "agriculture",..: 3 1 3 3 3 3 1 3 3 3
 $ a2.one: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
 $ a3.one: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3
 $ a1.two: Factor w/ 9 levels "agriculture",..: 3 3 3 3 3 3 3 3 3 3
 $ a2.two: Factor w/ 6 levels "development",..: 6 6 6 6 6 6 6 6 6 6
 $ a3.two: Factor w/ 3 levels "forest_pathogen",..: 3 3 3 3 3 3 3 3 3 3

レベルごとに変数の数が異なるためでしょうか?この場合、警告メッセージを無視できますか?

警告メッセージを生成するには:

library(reshape2)
test.m <- melt (test,id.vars=c('park'))
Warning message:
attributes are not identical across measure variables; they will be dropped

ありがとう。

50
cherrytree

説明:

溶けると、複数の列が1つに結合されます。この場合、それぞれがlevels属性を持つ因子列を結合しています。実際の要因は異なるため、これらのレベルは列全体で同じではありません。 meltは、各因子を文字に強制し、結果にvalue列を作成するときに属性を削除します。

この場合、警告は重要ではありませんが、同じ「タイプ」ではない列を結合するときは非常に注意する必要があります。 。たとえば、MPHの速度を含む列をLBの重量を含む列と溶かしたくないでしょう。

ファクター列を結合してもよいことを確認する1つの方法は、1つの列に可能な値が他のすべての列にある合理的な値になるかどうかを自問することです。その場合、おそらく正しいことは、すべての因子列が(同じ順序で)受け入れ可能なすべての可能なレベルを持っていることを確認することです。これを行うと、テーブルを溶かすときに警告が表示されなくなります。

イラスト:

library(reshape2)
DF <- data.frame(id=1:3, x=letters[1:3], y=rev(letters)[1:3])
str(DF)

xyのレベルは同じではありません:

'data.frame':  3 obs. of  3 variables:
$ id: int  1 2 3
$ x : Factor w/ 3 levels "a","b","c": 1 2 3
$ y : Factor w/ 3 levels "x","y","z": 3 2 1

ここでmeltと列xyを見て、(value)に溶け込みました:

melt(DF, id.vars="id")$value

文字ベクトルと警告が表示されます。

[1] "a" "b" "c" "z" "y" "x"
Warning message:
attributes are not identical across measure variables; they will be dropped 

ただし、同じレベルになるように係数をリセットし、その後のみ融解する場合:

DF[2:3] <- lapply(DF[2:3], factor, levels=letters)
melt(DF, id.vars="id", factorsAsStrings=F)$value

正しいファクターが得られ、警告はありません。

[1] a b c z y x
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z

meltのデフォルトの動作は、因子レベルが同一であってもドロップすることです。そのため、上記のfactorsAsStrings=Fを使用します。その設定を使用していなかった場合、文字ベクトルは取得できましたが、警告は表示されませんでした。デフォルトの動作は、結果を要素として保持することであると主張しますが、ここではそうではありません。

82
BrodieG

BrodieGの答えは素晴らしいです。ただし、列をリファクタリングするのが実用的でない場合があります(たとえば、128の固定幅列を持つGHCN気候データを、はるかに少ない数の列に溶かしたかった)。

その場合、最も簡単な解決策は、データを要素ではなく文字として扱うことです。たとえば、read.fwf(filename,stringsAsFactors=FALSE)を使用してデータを再インポートできます(_read.csv_でも同じ考え方が機能します)。列の数が少ない場合は、d$mystring<-as.character(d$myfactor)を使用して因子を文字列に変換できます。

1
John