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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:48:50