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

如何在R语言中为数据框各变量计算行差值并将其除以前一行对应值

嘿,这个需求其实就是计算环比增长率嘛,用R来实现很简单,我给你两种常用的方法,都能完美得到你想要的结果!

先构造你给出的示例数据框:

# 构造示例数据
df <- data.frame(
  A = c(15, 7, 8, 11, 4),
  B = c(14, 1, 22, 5, 12),
  C = c(12, 6, 5, 1, 4)
)

方法一:使用dplyr包(推荐,代码更简洁直观)

dplyr里的lag()函数可以直接获取前一行的值,结合mutate(across())就能批量处理所有列:

library(dplyr)

# 计算增长率并添加新列
df_result <- df %>%
  mutate(
    across(
      .cols = A:C,  # 指定要处理的列
      .fns = ~ (.x - lag(.x)) / lag(.x),  # 应用你的增长率公式
      .names = "{col}_r"  # 新列命名规则:原列名加_r
    )
  )

运行后df_result就是你要的结果,第一行因为没有前一行数据,所以新列都是NA,后面的行完全符合你的预期计算值。

方法二:基础R实现(无需额外安装包)

如果不想用第三方包,用基础R的diff()和lapply()也能搞定:

# 遍历每一列计算增长率,开头补NA
growth_rates <- lapply(df, function(col_data) {
  # diff(col_data)得到当前行-前一行的差值,除以col_data[-length(col_data)](前一行的值)
  c(NA, diff(col_data) / col_data[-length(col_data)])
})

# 转换为数据框并修改列名
growth_df <- as.data.frame(growth_rates)
colnames(growth_df) <- paste0(colnames(df), "_r")

# 合并原数据和增长率数据
df_result <- cbind(df, growth_df)

这个逻辑和方法一完全一致,只是用基础R函数实现,适合不想安装额外包的场景。

最后查看结果的话,直接打印df_result就能看到:

print(df_result, digits = 2)

输出会是:

A  B  C   A_r  B_r  C_r
1 15 14 12    NA   NA   NA
2  7  1  6 -0.53 -0.93 -0.50
3  8 22  5  0.14 21.00 -0.17
4 11  5  1  0.38 -0.77 -0.80
5  4 12  4 -0.64  1.40  3.00

完全符合你的预期!

内容的提问来源于stack exchange,提问作者Jamess11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:22:31