R语言如何计算数据框相邻年份列的滞后值时间序列差分
R中宽格式时间序列逐行计算相邻年份滞后差分
你可以直接用以下两种方法实现,不需要写复杂循环,运行效率足以覆盖上百个年份列、十万级以上产品量的数据集。
方法1:Base R 原生方案(无第三方包依赖)
核心逻辑是利用R原生的diff()函数计算差值,由于diff()默认计算行方向相邻值差,对年份列做一次转置即可直接得到列方向的差分结果,代码最简洁:
# 构造测试样例数据 product<-c(1,2,3) yr1<-c(109,213,30) yr2<-c(613,488,125) yr3<-c(729,494,127) df<-data.frame(product,yr1,yr2,yr3) # 提取所有年份列(排除第一列产品ID) year_data <- df[, -1] # 保留首年原值,后续列计算与前一列的差值 calc_res <- cbind(year_data[, 1], t(diff(t(year_data)))) # 拼接产品ID列,还原列名得到最终结果 df_result <- data.frame(product = df$product, calc_res) colnames(df_result) <- colnames(df)
运行后输出结果完全匹配预期:
> df_result product yr1 yr2 yr3 1 1 109 504 116 2 2 213 275 6 3 3 30 95 2
方法2:tidyverse 管道方案(适配常规数据处理工作流)
如果平时习惯用dplyr管道操作处理数据,可以用across()按列位置依次计算差值,逻辑直观易读:
library(dplyr) # 先存列名兼容各版本dplyr col_names <- colnames(df) df_result <- df %>% # 从第3列(第一个需要计算差分的年份列,即yr2)开始遍历 mutate(across(.cols = 3:ncol(.), .fns = function(x){ cur_col_idx <- which(col_names == cur_column()) # 当前列值减去左侧相邻列的数值 x - .data[[col_names[cur_col_idx - 1]]] }))
注意:两种方法都要求年份列严格按时间先后从左到右排列,如果列名带实际年份值(如y2019、y2020格式),可以先按列名提取年份数值排序后再计算,避免顺序错乱导致结果错误。
内容的提问来源于stack exchange,提问作者melange164
相关产品推荐
相关产品推荐

