R:帮助融合“不同行”的数据帧

时间:2013-11-08 03:29:28

标签: r data.table reshape2

我有一个数据框,我无法重塑2 ::融化。谁能帮我看看为什么?

> dput(x2)
structure(list(`26492` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), `28728` = c(0L, NA, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("26492", "28728"), class = c("data.table", 
"data.frame"), row.names = c(NA, -286L), .internal.selfref = <pointer: 0x0000000000330788>)

> melt(x2)
Using  as id variables
Error in data.frame(ids, variable, value, stringsAsFactors = FALSE) : 
  arguments imply differing number of rows: 0, 572

我还创建了这个数据框,里面有一个NA值,并且融化工作,所以我不确定问题出在哪里。

> df1 <- data.frame(x = rnorm(2), y = rnorm(2))
> df1[1,1]<-NA
> df1
           x          y
1         NA -1.0138754
2 -0.7848228  0.3117672
> melt(df1)
Using  as id variables
  variable      value
1        x         NA
2        x -0.7848228
3        y -1.0138754
4        y  0.3117672

1 个答案:

答案 0 :(得分:5)

data.framedata.table s虽然相关,但它们是不同的野兽,应该区别对待。这就是为什么在data.table版本1.8.11中,提供了一种新的melt方法。

总结一下我发现的内容,使用melt.data.frame会在data.table而不是data.frame上给您这个错误,因此您应该使用as.data.frame(YOUR_DATA_TABLE)或(推荐) )更新您的data.table版本。

示例:

library(reshape2)
library(data.table)

packageVersion("data.table")
# [1] ‘1.8.11’

## WORKS WITH WARNING THAT YOU DID NOT 
##  SUPPLY ID AND MEASURE VARIABLES
data.table:::melt.data.table(x2)
#      variable value
#   1:    26492     0
#   2:    26492     0
#   3:    26492     0
#   4:    26492     0
#   5:    26492     0
# ---               
# 568:    28728     0
# 569:    28728     0
# 570:    28728     0
# 571:    28728     0
# 572:    28728     0
# Warning message:
# In data.table:::melt.data.table(x2) :
#   To be consistent with reshape2's melt, id.vars and measure.vars 
#   are internally guessed when both are 'NULL'. All non-numeric/integer/
#   logical type columns are conisdered id.vars, which in this case are 
#   columns ''. Consider providing at least one of 'id' or 'measure' vars 
#   in future.

因此,data.table 1.8.11及更高版本引入了这个新的melt method ,事情有效。你说的错误在哪里?

## HERE'S YOUR ERROR
reshape2:::melt.data.frame(x2)
# Using  as id variables
# Error in data.frame(ids, variable, value, stringsAsFactors = FALSE) : 
#   arguments imply differing number of rows: 0, 572

## HERE'S A WORKAROUND
head(reshape2:::melt.data.frame(as.data.frame(x2)))
Using  as id variables
#   variable value
# 1    26492     0
# 2    26492     0
# 3    26492     0
# 4    26492     0
# 5    26492     0
# 6    26492     0

这也适用于你的小例子。

df1 <- data.frame(x = rnorm(2), y = rnorm(2))
df1[1,1]<-NA
DT <- data.table(df1)
reshape2:::melt.data.frame(DT)                ## ERROR
reshape2:::melt.data.frame(as.data.frame(DT)) ## NO ERROR
data.table:::melt.data.table(DT)              ## Warning. NO ERROR

更新

如果指定了ID var,则似乎不会发生此错误:

df1 <- data.frame(matrix(rnorm(6), ncol = 3))
df1[1, 2] <- NA
df1    

DT <- data.table(df1)
reshape2:::melt.data.frame(DT, id.vars="X1")    ## NO ERROR
#           X1 variable       value
# 1  1.3586796       X2          NA
# 2 -0.1027877       X2 -0.05380504
# 3  1.3586796       X3 -1.37705956
# 4 -0.1027877       X3 -0.41499456
data.table:::melt.data.table(DT, id.vars="X1")  ## NO ERROR
#            X1 variable       value
# 1:  1.3586796       X2          NA
# 2: -0.1027877       X2 -0.05380504
# 3:  1.3586796       X3 -1.37705956
# 4: -0.1027877       X3 -0.41499456