R 按id重新排列DT,以便将所有不同的值放在相邻的列中
如何按id重新排列data.table,以便相同id内的列彼此相邻? 以下代码是输入和期望输出的简短示例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)),
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]