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

R语言如何计算数据框相邻两行的周度百分比差异?

计算周度间环比百分比差异实现方法

需求说明

  • 计算规则:按周顺序逐周对比,即第N周数值与第N-1周数值计算百分比差异,依次向前递推,支持任意周数的数据集,不局限于示例的3周数据
  • 预期效果参考:
    周环比结果呈现示例

图中数值为演示样例,与实际数据计算结果不对应

测试数据集

df <- structure(list(week = c(25, 26, 27), viernes = c(6027, 4731, 
6022), sábado = c(NA, 7807, 5059), domingo = c(NA, 10360, 5914
), lunes = c(NA, 6165, 6443), martes = c(NA, 5274, 7157), miércoles = c(NA, 
4764, 7411), jueves = c(NA, 4377, 7176)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L))

最优实现方案

用dplyr的偏移函数lag()实现是最简洁、扩展性最好的方案,不需要手动写循环,周数增减时不需要修改代码:

  1. 先按周字段升序排序,避免周数顺序错乱导致计算错位
  2. 对除周数外的所有数值列,逐行取上一周同列的数值做环比计算
library(dplyr)

# 基础计算:返回数值型百分比结果
df_result <- df %>%
  arrange(week) %>%
  mutate(across(
    .cols = -week,
    .fns = ~ (.x - lag(.x)) / lag(.x) * 100,
    .names = "{.col}_周环比(%)"
  ))

如果需要格式化输出带百分号、保留指定小数位的结果,可以用scales包的百分比格式化函数:

library(scales)

df_result_formatted <- df %>%
  arrange(week) %>%
  mutate(across(
    .cols = -week,
    .fns = ~ percent((.x - lag(.x))/lag(.x), accuracy = 0.01),
    .names = "{.col}_周环比"
  ))

注意事项

  • 第一行(最早一周)因为没有上一周参照数据,环比结果自动返回NA,符合常规统计逻辑
  • 原始数据中的缺失值不会影响行对齐逻辑,计算时会自动跳过缺失值对应的行
  • 如果需要生成和参考图一致的“原始值+环比值”并排展示的宽表,直接调整列顺序即可,不需要额外做数据转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:30:36