我有一个数据框,我无法重塑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
答案 0 :(得分:5)
data.frame
和data.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