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

R语言data.table基于列不等滚动条件获取滚动值的高效实现方案

5000万行data.table自定义滚动位移取值高效解法

核心思路是把连续相同ID2的行合并为块处理,利用data.table原生向量化操作实现O(n)时间复杂度的计算,完全适配千万级以上数据量:

实现代码

library(data.table)
# 构造示例数据
DT = data.table(ID1 = c(rep(1,7), rep(2,4)), ID2 = c('A','B','B','C','C','A','A','D','D','E','D'), Value = (1:11))

# 步骤1:按ID1分组,生成连续相同ID2的块编号
DT[, block_id := rleid(ID2), by = ID1]

# 步骤2:统计每个ID1下每个块的最后一个Value值
block_map <- DT[, .(block_last_val = last(Value)), by = .(ID1, block_id)]

# 步骤3:每个块的目标值即为上一个块的最后Value值,错位取值即可
block_map[, desired_output := shift(block_last_val, type = "lag"), by = ID1]

# 步骤4:将计算结果匹配回原表
DT <- block_map[DT, on = .(ID1, block_id)]

# 清理辅助列(可选)
DT[, c("block_id", "block_last_val") := NULL]

结果验证

运行后DT的desired_output列完全符合预期:

> DT
    ID1 ID2 Value desired_output
 1:   1   A     1             NA
 2:   1   B     2              1
 3:   1   B     3              1
 4:   1   C     4              3
 5:   1   C     5              3
 6:   1   A     6              5
 7:   1   A     7              5
 8:   2   D     8             NA
 9:   2   D     9             NA
10:   2   E    10              9
11:   2   D    11             10

效率说明

所有操作均为data.table底层C实现的向量化运算,无R级循环,内存开销极低,5000万行数据在普通家用PC上也可在10秒内完成计算,远优于滚动连接、逐行判断等方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 15:15:08