为R Data Table的每个分组补充指定缺失行
解决data.table分组补充缺失val值行的问题
需求:现有一个包含多分组的data.table,需要为每个分组补充vals中存在但该分组未包含的val值对应的行,其余列填充NA。
示例代码
library(data.table) DT = data.table(group = c(1,1,1,2,2,3,3,3,3), val = c(1,2,4,2,3,1,2,3,4), somethingElse = rep(1,9)) vals = data.table(val = c(1,2,3,4))
期望输出
group val somethingElse 1: 1 1 1 2: 1 2 1 3: 1 3 NA 4: 1 4 1 5: 2 1 NA 6: 2 2 1 7: 2 3 1 8: 2 4 NA 9: 3 1 1 10: 3 2 1 11: 3 3 1 12: 3 4 1
解决方法
方法一:交叉连接+左连接
先通过CJ()生成所有group和val的组合,再与原表左连接,自动填充缺失值为NA:
# 生成所有分组与val的笛卡尔积 all_pairs <- CJ(group = unique(DT$group), val = vals$val) # 左连接原表,匹配对应列的值 result <- all_pairs[DT, on = .(group, val), somethingElse := i.somethingElse]
方法二:分组内全连接
按group分组后,每个分组与vals做连接,保留所有val行,缺失值自动填充NA:
result <- DT[, .SD[vals, on = "val", nomatch = NA], by = group]
两种方法都能满足需求,若需要固定val的顺序,可在结果后添加order(group, val)调整。
内容的提问来源于stack exchange,提问作者mri
相关产品推荐
相关产品推荐

