如何用data.table筛选符合条件的行,组内无符合条件则取首行?
基于data.table的分组行筛选实现
需求概述
- 从大规模数据集中筛选出
monthX列值>0的行 - 若某个按
ID分组的组内无满足条件的行,则保留该组的第一行 - 最终每个
ID仅保留一行记录
示例代码与数据
library(data.table) # 构造示例数据 df1 <- data.frame( ID = c(rep(1,3), rep(2,3), rep(3,4)), Mo = c(1:3, 1:3, 1:4), stX = c("NA", "X", "X", "NA", "NA", "NA", "NA", "X", "NA", "NA") ) df2 <- df1 # 转换为data.table并执行分组处理 df2 <- setDT(df2)[, firstX := +(.I == .I[stX == 'X'][1]), by = ID][ , monthX := ifelse(firstX == 1, Mo, 0) ]
代码解析
- 先将普通数据框转换为data.table格式,借助其高效的分组运算能力适配大规模数据集
- 按
ID分组后,标记每组中第一个stX等于X的行(firstX列赋值为1,其余行赋值为0) - 通过
monthX列生成筛选标记:firstX为1的行保留Mo的值,其余行赋值为0。后续可通过monthX > 0筛选目标行,对无符合条件行的分组,直接保留该组第一行即可满足需求
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

