如何用R data.table计算各id年度参数同比比值并优化列布局?
用data.table的
shift()函数实现需求 完全可以用shift()替代滚动连接来搞定,步骤更简洁,还能直接控制新增列的位置,同时计算比值。
操作步骤
- 先按
id和year排序(这是shift()生效的前提,保证每个id内年度顺序正确)dt <- dt[order(id, year)] - 生成上一年度的参数列,直接追加到原数据右侧
假设你的参数列是param1、param2,用.SDcols指定要处理的列,按id分组取前一行(上一年)的值:dt[, c("param1_prev", "param2_prev") := shift(.SD, n=1, type="lag"), by = id, .SDcols = c("param1", "param2")] - 计算「当年值/上一年度值」的比值列,同样追加到右侧:
dt[, c("param1_ratio", "param2_ratio") := .(param1/param1_prev, param2/param2_prev)]
补充说明
- 用
shift()不需要做滚动连接,避免了原数据和历史值列位置混乱的问题,新增列直接排在原数据后面 - 如果某id的第一年没有上一年数据,
shift()会返回NA,对应的比值也会是NA,符合逻辑 - 如果参数列很多,可以用批量写法简化操作:
param_cols <- c("param1", "param2", "param3") # 批量生成上年度值列 dt[, paste0(param_cols, "_prev") := shift(.SD, n=1, type="lag"), by=id, .SDcols=param_cols] # 批量生成比值列 dt[, paste0(param_cols, "_ratio") := mapply(function(x, y) x/y, .SD, .SD[, paste0(param_cols, "_prev"), with=FALSE]), .SDcols=param_cols]
内容的提问来源于stack exchange,提问作者Howdyouride
相关产品推荐
相关产品推荐

