如何优化R语言YOY同比平均函数 提升效率并返回正确结果
问题根因
你当前的YOY计算逻辑存在两个核心问题:
mutate默认按列处理数据,调用时传入的.是完整数据框,YOY函数内部会将所有行的年份数值列全部压扁为一个全局向量计算,返回的是全表平均YOY值,因此所有行结果完全一致- 原函数频繁做转置、数据框转换操作,冗余计算多,运行效率低
优化方案
1. 重写YOY计算函数
改为直接接收数值向量计算,减少冗余转换:
# 计算连续年份平均同比增长率 # 参数说明:num_vec 为按年份顺序排列的数值向量,digits 为结果保留小数位数 calc_avg_yoy <- function(num_vec, digits = 2) { yoy_vec <- (num_vec[-1] / num_vec[-length(num_vec)] - 1) * 100 return(round(mean(yoy_vec, na.rm = TRUE), digits)) }
2. 正确调用方法
小数据量场景(逐行处理易读性高)
搭配dplyr的rowwise按行计算:
library(dplyr) df %>% rowwise() %>% mutate(`yoy %` = calc_avg_yoy(c_across(starts_with("x")))) %>% ungroup()
大数据量场景(向量化计算效率更高)
无需逐行遍历,直接用矩阵运算完成:
library(dplyr) year_cols <- select(df, starts_with("x")) df$`yoy %` <- round(rowMeans((year_cols[,-1] / year_cols[,-ncol(year_cols)] - 1) * 100, na.rm = TRUE), 2)
结果验证
运行后返回结果完全符合预期:
| colA | colB | x2008 | x2009 | x2010 | yoy % |
|---|---|---|---|---|---|
| A | Stringn | 2.71 | 1.72 | 1.32 | -29.9 |
| B | Stringc | 3.1 | 1.68 | 2.66 | 6.26 |
| C | Stringb | 6.21 | 6.18 | 4.21 | -16.18 |
内容的提问来源于stack exchange,提问作者cnauber
相关产品推荐
相关产品推荐

