1. ホーム
  2. r

[解決済み】reshape2 meltの警告メッセージ

2022-01-30 13:04:48

質問内容

私は 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

ありがとうございます。

どのように解決するのですか?

解説です。

溶かすということは、複数の列を1つにまとめるということです。 この場合、因子列を結合していることになり、それぞれの因子列には levels 属性があります。 これらのレベルは、実際にはファクターが異なるため、カラム間で同じではありません。 melt を作成する際に、各要素を文字に強制し、その属性を削除するだけです。 value カラムを作成します。

この場合、警告は重要ではありませんが、同じ"type"でない列を組み合わせる場合は、非常に注意する必要があります。quot;type"は単なるベクトルの型ではなく、それが参照するものの性質を一般的に意味します。 例えば、速度をMPHで表した列と重さをLBで表した列を溶かしたくはないでしょう。

要因の列を組み合わせても問題ないことを確認する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 上記のとおりです。 もしその設定を使わなければ、文字ベクターは出ても警告は出なかったはずです。 私は、デフォルトの動作は、結果を要因として維持することであるべきだと主張しますが、ここではそうではありません。