如何使用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
方案说明
- 生成映射表:从原表筛选出所有
condition=TRUE的行,用shift(row)获取每个满足条件行的上一个满足条件行的row值,同时将当前行的row命名为current_row作为join键。 - 更新连接:利用data.table的更新连接特性,将映射表中的
prev_true_row值匹配到原表对应row的位置,非匹配行自动保留NA,这种方式在处理大数据量时效率远高于逐行遍历。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

