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
相关产品推荐
相关产品推荐

