R 按id重新排列DT,以便将所有不同的值放在相邻的列中

R 按id重新排列DT,以便将所有不同的值放在相邻的列中,r,data.table,R,Data.table,如何按id重新排列data.table,以便相同id内的列彼此相邻? 以下代码是输入和期望输出的简短示例 require(data.table) set.seed(456) DT <- data.table(id = c(1,1,1, 2,2, 3,3, 4,4,4, 5), X = round(runif(11, 0, 1),2), Y = round(runif(11, 5, 10)),

如何按id重新排列data.table,以便相同id内的列彼此相邻? 以下代码是输入和期望输出的简短示例

require(data.table)
set.seed(456)
DT <- data.table(id = c(1,1,1, 2,2, 3,3, 4,4,4, 5),
                 X  = round(runif(11, 0, 1),2),
                 Y  = round(runif(11, 5, 10)),
                 A  = c(rep(9, 3), rep(10, 2), rep(11, 2), rep(12, 3), 13))
我想要这样的东西: 对于id中的每个子集:在每个id中的所有常量变量之后,此处:A和id,通过创建新列X->X1、X2、X3、Y->Y1、Y2、Y3,将所有不同的变量放入每个id中,此处:X和Y列位于同一行中 按id列出的出现次数不同,在我的示例中为1到3,因此所有出现次数小于3的id的缺失值都应该用NA填充

期望输出

require(data.table)
set.seed(456)
DT <- data.table(id = c(1,1,1, 2,2, 3,3, 4,4,4, 5),
                 X  = round(runif(11, 0, 1),2),
                 Y  = round(runif(11, 5, 10)),
                 A  = c(rep(9, 3), rep(10, 2), rep(11, 2), rep(12, 3), 13))
用DT[,.N,by=id]很容易得到每个子集中的项数,但我很难完成下一步。当然,列和行的数量要大得多,因此我更喜欢列命名较少的解决方案,但当然应该在某个地方定义常量和不同的列。

我们可以使用dcast


非常好的解决方案!我有机会用data.table解决每一个问题,只要两行就行了。但是,我对您的解决方案进行了改进,以更好地满足我的期望结果:dcastDT,id+A~rowidd,value.var=cX,Y,因此:res[,cid,A,namesres[-c1,2][ordersub\\D+,namesres[-c1,2]],with=FALSE]@Phann谢谢您的评论。我的解决方案可能是重复的,除了我不知道dcast就永远找不到它的原因。@Jaap我想OP也要求重新排列列,在这种情况下,你复制的链接将很难找到它。在id旁边有一个常量列是另一个区别。
# id  A   X1 Y1   X2 Y2   X3 Y3
#  1  9 0.09  6 0.21  9 0.73  9
#  2 10 0.85  8 0.79  8   NA NA
#  3 11 0.33  9 0.08  7   NA NA
#  4 12 0.29  9 0.24  6 0.39  6
#  5 13 0.37  9   NA NA   NA NA
# ...
library(data.table)
res <- dcast(DT, id~rowid(id), value.var = c("X", "Y", "A"))
res[, c("id", names(res)[-1][order(sub("\\D+", "", names(res)[-1]))]), with = FALSE]