使用CJ补全R data.table分组行,保留NA行并统一组行数
使用CJ函数补全data.table分组数据,统一各分组行数
我来帮你搞定这个需求!你需要让每个分组的行数和数据里行数最多的分组保持一致,还要用CJ函数实现,同时保留缺失值对应的NA行,对吧?咱们一步步来:
先看示例数据
首先先把你的示例数据跑出来,方便后续操作:
require(data.table) dt <- data.table( a=c(1,3,5,1,2,3,4,5,1,5), b=c("gpA","gpA","gpA","gpB","gpB","gpB","gpB","gpB","gpC","gpC"), c=c(2346,2314,345,234,578,36,234,547,3425,234) )
原数据里gpB有5行,是所有分组里最多的,所以我们要把gpA(3行)和gpC(2行)都补到5行,缺失的位置用NA填充。
实现步骤与代码
核心思路是先给每个分组内的行编序号,再用CJ生成所有分组+完整行号的网格,最后和原数据左连接来补全:
# 1. 给每个分组内的行添加从1开始的序号 dt[, rn := seq_len(.N), by = b] # 2. 找到所有分组中最大的行数 max_row_count <- dt[, max(.N), by = b][, max(V1)] # 3. 用CJ生成完整的分组-行号网格:每个分组都有1到max_row_count的行号 full_grid <- CJ( b = unique(dt$b), rn = 1:max_row_count, sorted = FALSE # 保持分组的原有顺序,可选 ) # 4. 左连接原数据与完整网格,补全缺失的行 result_dt <- full_grid[dt, on = .(b, rn), .(a, b, c, rn)] # 可以把rn列删掉,看最终结果(可选) result_dt[, rn := NULL]
最终效果
运行完后result_dt里每个分组都有5行,gpA的第4、5行和gpC的第3-5行,a和c列都会是NA,完全符合你的要求!
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

