多列中的首次滞后计算:跨列获取因子变量的首次滞后值
解决两列因子变量的首次滞后值问题
我帮你整理了一套用data.table处理的方案,核心思路是先把分散在两列的因子整合到同一维度,这样就能统一追踪每个因子的历史记录,具体步骤如下:
第一步:将宽表转成窄格式
首先把item1/item2和对应的value1/value2合并成两列(item和value),同时保留原表的行号和iteration,让每个因子的所有出现记录都集中在一起:
# 加载依赖并生成示例数据(你已提供,这里完整复现) require(data.table) set.seed(21) dt <- data.table(item1 = c(rep(sample(letters[1:5]), 2), sample(letters[6:10])), item2 = c(rep(sample(letters[6:10]), 2), sample(letters[1:5])), value1 = rnorm(15, 5, 2), value2 = rnorm(15, 5, 2), iteration = rep(1:3, each = 5)) # 转成窄格式,保留原行号用于后续匹配回原表 long_dt <- rbind( dt[, .(row_id = .I, item = item1, value = value1, iteration = iteration)], dt[, .(row_id = .I, item = item2, value = value2, iteration = iteration)] )
第二步:按因子分组计算滞后值
现在每个因子的所有出现都在同一分组里了,我们用data.table的shift函数计算每个因子前一次出现的value和iteration(也就是你要的首次滞后值):
# 按item分组,按原行号排序(保证时间顺序),计算滞后1步的值 long_dt[, `:=`( lag_value = shift(value, n = 1, type = "lag"), lag_iteration = shift(iteration, n = 1, type = "lag") ), by = item]
这里shift(..., type="lag")会取每个组内当前行的前一行数据,首次出现的因子对应的滞后值会是NA,这符合逻辑——毕竟没有历史记录可以追溯。
第三步:把滞后值匹配回原表
最后把计算好的滞后值对应到原表的item1和item2列上,这样原表就有了每个位置因子的首次滞后值:
# 匹配item1的滞后值到原表 dt[long_dt[item == item1], on = .(row_id), `:=`(lag_value_item1 = i.lag_value, lag_iter_item1 = i.lag_iteration)] # 匹配item2的滞后值到原表 dt[long_dt[item == item2], on = .(row_id), `:=`(lag_value_item2 = i.lag_value, lag_iter_item2 = i.lag_iteration)]
你可以查看最终的dt结果,比如第6行的item1是d,它的lag_value_item1就是第1行里d对应的value1,完美实现了不管因子出现在哪一列,都能追踪到它上一次出现的记录。
内容的提问来源于stack exchange,提问作者Tomas Ericsson
相关产品推荐
相关产品推荐

