You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:36:02