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

如何使用data.table连接操作获取满足条件的最后一行

使用data.table的join操作实现需求

需求说明

我们需要在data.table中,通过join(效率最优的方式)实现:仅当某一行的condition为TRUE时,返回上一个满足condition=TRUE的行对应的row值,其余行返回NA。例如示例数据中第6行(condition=TRUE)应返回3,其他行返回NA。

示例数据

library(data.table)
mydt <- data.table(condition = c(F,F,T,F,F,T,F,F,F,F), row = 1:10)

解决方案代码

# 提取所有condition为TRUE的行,生成包含上一个满足条件行的映射表
true_rows <- mydt[condition == TRUE, .(current_row = row, prev_true_row = shift(row))]

# 通过更新连接将结果匹配回原表
mydt[true_rows, on = .(row = current_row), prev_true_row := i.prev_true_row]

结果验证

执行上述代码后,mydt的输出如下:

condition row prev_true_row
 1:     FALSE   1            NA
 2:     FALSE   2            NA
 3:      TRUE   3            NA
 4:     FALSE   4            NA
 5:     FALSE   5            NA
 6:      TRUE   6             3
 7:     FALSE   7            NA
 8:     FALSE   8            NA
 9:     FALSE   9            NA
10:     FALSE  10            NA

方案说明

  1. 生成映射表:从原表筛选出所有condition=TRUE的行,用shift(row)获取每个满足条件行的上一个满足条件行的row值,同时将当前行的row命名为current_row作为join键。
  2. 更新连接:利用data.table的更新连接特性,将映射表中的prev_true_row值匹配到原表对应row的位置,非匹配行自动保留NA,这种方式在处理大数据量时效率远高于逐行遍历。

内容的提问来源于stack exchange,提问作者gaut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:10:34