如何将data.table分组列的多行值转为多列并保留顺序?
解决方案
要实现按A分组将B列多行转成多列且保留原有顺序,用data.table的dcast就能可靠解决,关键是先给每个分组内的行添加顺序索引,具体步骤如下:
给分组内的行生成顺序标记
先在原数据表中新增一列,标记每个A分组内的行顺序(比如1、2),确保转置时B值的顺序不会乱:library(data.table) dt <- data.table(A=c("a","a","b","b","c","c"), B=c(3,2,4,7,12,13)) dt[, idx := seq_len(.N), by = A]执行后dt会变成:
A B idx 1: a 3 1 2: a 2 2 3: b 4 1 4: b 7 2 5: c 12 1 6: c 13 2用
dcast转置数据
以A为行,idx为列,B为值进行转置,同时可以直接指定列名:result <- dcast(dt, A ~ paste0("V", idx), value.var = "B")得到的结果完全符合需求:
A V1 V2 1: a 3 2 2: b 4 7 3: c 12 13
方案可靠性说明
data.table的分组操作by = A会严格保留原数据的行顺序,生成的idx完全对应B列的原始顺序;dcast是data.table原生的转置函数,处理大数据集时效率远高于matrix转换,且不会出现乱序问题,即使分组内行数不一致(比如有的组3行),也会自动生成对应列并填充NA,兼容性更强。
内容的提问来源于stack exchange,提问作者Umesh Yadav
相关产品推荐
相关产品推荐

