如何在R的data.table中按分组删除指定列首次出现0及后续所有行
实现方案
你可以直接使用data.table原生的分组语法完成需求,以下是两种高效实现方式:
方法1:基于累积乘积的简洁写法
该方法利用0-1变量的累积乘积特性,一旦遇到0后续累积结果恒为0,直接筛选即可:
library(data.table) # 构造原始数据 data <- data.table(k = c("a", "a", "a", "a", "b", "b", "c", "c", "c", "d"), year = c(2011, 2012, 2013, 2014, 2012, 2013, 2014, 2015, 2016, 2001), grow_bool = c(1, 1, 0, 1, 0, 1, 1, 0, 1, 0)) # 核心筛选代码 res <- data[, .SD[cumprod(grow_bool) == 1], by = k]
运行后得到的res就是你需要的结果:
k year grow_bool 1: a 2011 1 2: a 2012 1 3: c 2014 1
方法2:基于首次0位置的显式写法
如果你需要更明确的控制首次出现0的截断逻辑,可以用以下写法:
res <- data[, { first_zero_pos <- which(grow_bool == 0)[1] if (is.na(first_zero_pos)) { .SD # 组内无0,保留全部行 } else { .SD[seq_len(first_zero_pos - 1)] # 保留首次0之前的行 } }, by = k]
该写法逻辑更直观,也兼容组内无0的场景,性能和方法1基本一致。
内容的提问来源于stack exchange,提问作者Shawn Brar
相关产品推荐
相关产品推荐

