关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
5年前关闭。
Improve this question
我想转换这样的表 (*):
set.seed(1)
mydata <- data.frame(ID=rep(1:4, each=3), R=rep(1:3, times=4), FIXED=rep(runif(4), each=3), AAA=rnorm(12), BBB=rbinom(12,12,0.5), CCC=runif(12))
ID R FIXED AAA BBB CCC
1 1 0.26 -0.83 8 0.82
1 2 0.26 1.59 5 0.64
1 3 0.26 0.32 6 0.78
2 1 0.37 -0.82 6 0.55
2 2 0.37 0.48 6 0.52
2 3 0.37 0.73 4 0.78
3 1 0.57 0.57 8 0.02
3 2 0.57 -0.30 7 0.47
3 3 0.57 1.51 7 0.73
4 1 0.90 0.38 4 0.69
4 2 0.90 -0.62 7 0.47
4 3 0.90 -2.21 6 0.86
变成宽格式,像这样:
ID FIXED AAA1 BBB2 CCC2 FIXED2 AAA2 BBB2 CCC2 FIXED3 AAA3 BBB3 CCC3
1 0.27 0.49 7 0.73 0.37 0.74 4 0.69 0.57 0.58 7 0.48
2 0.91 -0.31 6 0.86 0.20 1.51 8 0.44 0.90 0.39 7 0.24
3 0.94 -0.62 7 0.07 0.66 -2.21 6 0.10 0.63 1.12 6 0.32
4 0.06 -0.04 7 0.52 0.21 -0.02 3 0.66 0.18 0.94 6 0.41
我该怎么做?
我试过
dcast(mydata, ID + FIXED ~ R, value.var=(names(mydata)[3:5])
甚至写列名,“AAA”,“BBB”,“CCC”,但它产生一个错误,我不能得到我需要的宽格式。我也尝试过其他选择,但没有运气。
我该怎么做?
(*) 实际上有更多的专栏,但故事是一样的。
错误是:
Error in .subset2(x, i, exact = exact) :
recursive indexing failed at level 2
In addition: Warning message:
In if (!(value.var %in% names(data))) { :
the condition has length > 1 and only the first element will be used
最佳答案
您引用了错误的值变量( AAA
、 BBB
和 CCC
列的索引号为 4 - 6),您应该使用 setDT()
将数据帧转换为数据表。使用:
dcast(setDT(mydata), ID + FIXED ~ R, value.var = names(mydata)[4:6])
这使:
ID FIXED AAA_1 AAA_2 AAA_3 BBB_1 BBB_2 BBB_3 CCC_1 CCC_2 CCC_3
1: 1 0.2655087 -0.8356286 1.5952808 0.3295078 8 5 6 0.8209463 0.6470602 0.7829328
2: 2 0.3721239 -0.8204684 0.4874291 0.7383247 6 6 4 0.5530363 0.5297196 0.7893562
3: 3 0.5728534 0.5757814 -0.3053884 1.5117812 8 7 7 0.0233312 0.4772301 0.7323137
4: 4 0.9082078 0.3898432 -0.6212406 -2.2146999 4 7 6 0.6927316 0.4776196 0.8612095
如果不转换为数据表,
data.table
包将回退到 dcast
的执行来自 reshape2
无法处理多个 value.var
's,因此是错误消息。如果你想要另一个分隔符,你可以添加例如
sep = '.'
dcast
的参数.
关于r - 带有 dcast data.table 的宽格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37622935/