R语言:如何计算各层级数据相对于基准年2019的变化值
解决R语言中计算定基增长率(以2019年为基准)的问题
嗨,我来帮你搞定这个需求!你现在需要的是定基增长率——也就是各年份数据和2019基准年的比值,而不是lag()生成的环比(当年和上一年比)结果。这里有几种简单高效的实现方法:
方法一:分组后直接引用基准年数据
这是最简洁的写法,利用dplyr的分组特性,在每个level组内直接提取2019年的平均值作为分母:
library(dplyr) # 你的原始数据框 df <- tibble( level = rep(c("Low", "Mid", "High"), 3), year = rep(c(2019, 2020, 2021), each = 3), average = c(1300, 2065, 2194, 2966, 4723, 5915, 4049, 5915, 5978) ) # 计算定基增长率 result <- df %>% group_by(level) %>% mutate(growth_rate = average / average[year == 2019]) %>% ungroup() print(result)
运行结果:
| level | year | average | growth_rate |
|---|---|---|---|
| Low | 2019 | 1300 | 1.0000 |
| Mid | 2019 | 2065 | 1.0000 |
| High | 2019 | 2194 | 1.0000 |
| Low | 2020 | 2966 | 2.2815 |
| Mid | 2020 | 4723 | 2.2872 |
| High | 2020 | 5915 | 2.6960 |
| Low | 2021 | 4049 | 3.1146 |
| Mid | 2021 | 5915 | 2.8644 |
| High | 2021 | 5978 | 2.7247 |
方法二:左连接基准年数据(更直观)
如果希望更清晰地展示基准值的来源,可以先提取2019年的数据作为基准表,再通过left_join和原表合并后计算:
# 提取2019年作为基准表 base_data <- df %>% filter(year == 2019) %>% rename(base_average = average) %>% select(level, base_average) # 左连接并计算增长率 result <- df %>% left_join(base_data, by = "level") %>% mutate(growth_rate = average / base_average) %>% select(-base_average) # 可选:移除基准值列 print(result)
额外扩展:计算百分比形式的增长值
如果需要的是增长百分比(比如“增长128%”而非“2.28倍”),只需修改计算逻辑:
mutate(growth_rate_percent = (average / average[year == 2019] - 1) * 100)
这样就能得到以百分比表示的变化幅度啦!
内容的提问来源于stack exchange,提问作者Rheya Sward
相关产品推荐
相关产品推荐

