重塑2融化警告信息

我正在使用melt并遇到以下警告消息:
attributes are not identical across measure variables; they will be dropped

环顾四周后,人们提到这是因为variables是不同的类; 但是,我的数据集不是这种情况。

这里是数据集:

 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 

是否因为每个variables的级数不同? 那么,在这种情况下,我可以忽略这个警告信息吗?

要生成警告消息:

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

谢谢。

一个解释:

当你融化时,你将多个列合并为一个。 在这种情况下,您正在合并因子列,每个列都有一个levels属性。 这些级别在列之间并不相同,因为您的因素实际上是不同的。 melt只是强迫每个因素的字符,并在结果中创buildvalue列时放弃其属性。

在这种情况下,警告并不重要,但是在组合非“相同”types的列时,需要非常小心,其中“types”并不仅仅指向vectortypes,而是泛指所涉及事物的性质。 例如,我不想熔化一个包含MPH速度的列,其中一个包含LB中的权重。

一种方法来确认结合你的因子列是可以的,那就是问自己一列中的任何可能的值是否在每一列中都是合理的值。 如果是这样的话,那么可能正确的做法是确保每个因子列都有可能接受的所有可能的级别(以相同的顺序)。 如果你这样做,当你融化桌子时,你不会得到警告。

插图:

 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 

我们得到一个angular色vector和一个警告:

 [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] abczyx Levels: abcdefghijklmnopqrstu vwxyz 

melt的默认行为是降低因子水平,即使它们是相同的,这就是为什么我们使用factorsAsStrings=F以上。 如果你没有使用这个设置,你会得到一个angular色vector,但没有警告。 我认为默认行为应该是保持结果的一个因素,但在这里并不是这样。

BrodieG的回答非常好, 然而在某些情况下,对列进行重构是不切实际的(例如,我想融入更less数量的列的128个固定宽度列的GHCN气候数据)。

在这种情况下,最简单的解决scheme是将数据视为字符而不是因素:例如,可以使用read.fwf(filename,stringsAsFactors=FALSE)重新导入数据read.fwf(filename,stringsAsFactors=FALSE)对于read.csv ,同样的想法也适用) 。 对于较less数量的列,可以使用d$mystring<-as.character(d$myfactor)将因子转换为string。