如何将data.table的唯一ID设为列名,按序填充value并补NA?
解决方法
步骤说明
- 添加分组列:用
cumsum(ID == 1)生成分组标识,每个分组以ID=1开头,包含到下一个ID=1前的所有行。 - 使用
dcast重塑数据:通过data.table的dcast函数将分组作为行,ID作为列,vlaue作为单元格值,缺失值自动用NA填充(字符型列的NA在data.table中显示为空)。 - 移除分组列:可选操作,让输出结果与预期结构完全一致。
代码实现
library(data.table) # 原始数据 df <- data.table(ID = c(1,2,3,1,2,1,1,2,3), vlaue = c("A", "B", "C", "A", "B", "A", "A", "B", "C")) # 步骤1:生成分组标识 df[, group := cumsum(ID == 1)] # 步骤2:重塑数据 df2 <- dcast(df, group ~ ID, value.var = "vlaue") # 步骤3:移除分组列(可选) df2[, group := NULL] # 查看结果 df2
输出结果
> df2 1 2 3 1: A B C 2: A B 3: A 4: A B C
原理
cumsum(ID ==1)会为每个以ID=1开头的区块创建唯一分组,正好对应你想要的输出行数。dcast将每个分组转为一行,每个唯一ID作为列,缺失的ID对应位置填充NA,而data.table对字符型列的NA会显示为空,完美匹配预期输出。
内容的提问来源于stack exchange,提问作者Andrew Scotchmer
相关产品推荐
相关产品推荐

