基于tidyverse实现分组计算2022年Index与前三年均值的比值
解决方法:计算2022年Index与2019-2021年均值的比值
原代码问题分析
你之前的代码用lag()逐行提取前3、2、1行的Index值再取平均,这是移动平均逻辑,而非针对2019-2021这特定三年的均值计算,因此无法满足需求。
方案1:先计算均值再合并匹配(清晰直观)
library(tidyverse) # 第一步:单独计算每个分组2019-2021年的Index均值 mean_2019_2021 <- Index_df %>% filter(Year %in% 2019:2021) %>% group_by(Economy, SitcRev3Product) %>% summarise(mean_index_2019_2021 = mean(Index, na.rm = TRUE), .groups = "drop") # 第二步:合并均值到原数据,仅在2022年计算比值 Index_df <- Index_df %>% left_join(mean_2019_2021, by = c("Economy", "SitcRev3Product")) %>% mutate(Index_2022_to_mean = ifelse(Year == 2022, Index / mean_index_2019_2021, NA))
方案2:分组内直接计算(更紧凑)
Index_df <- Index_df %>% group_by(Economy, SitcRev3Product) %>% mutate( # 提取分组内2019-2021的Index值计算均值 mean_index_2019_2021 = mean(Index[Year %in% 2019:2021], na.rm = TRUE), # 仅在2022年生成比值,其余年份设为NA Index_2022_to_mean = case_when( Year == 2022 ~ Index / mean_index_2019_2021, TRUE ~ NA_real_ ) ) %>% ungroup()
注意事项
- 加入
na.rm = TRUE是为了处理部分分组2019-2021年存在缺失值的情况,避免均值直接变成NA。 - 若你的数据每个
Economy + SitcRev3Product分组每年仅有一条记录,两种方案均可稳定运行;若存在多条年记录,需先按分组+年份聚合(比如取每年的均值/总和)再执行上述逻辑。
内容的提问来源于stack exchange,提问作者dkolkin
相关产品推荐
相关产品推荐

