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()实现是最简洁、扩展性最好的方案,不需要手动写循环,周数增减时不需要修改代码:
- 先按周字段升序排序,避免周数顺序错乱导致计算错位
- 对除周数外的所有数值列,逐行取上一周同列的数值做环比计算
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
相关产品推荐
相关产品推荐

