如何在R中生成季度值及12个月滚动季度求和结果?
需求说明
已有按季度汇总后的数据集(通过df$Quarter <- quarter(df$Month, fiscal_start = 4, with_year = T)生成季度列,格式如2022.1),需要为每个区域新增一行数据,计算对应季度的连续4个季度求和结果(即12个月滚动值),最终合并原季度数据与滚动数据,并添加标识区分数据类型。
示例原始数据:
| 区域 | 季度 | 指标1 |
|---|---|---|
| Area_a | 2022.1 | 5 |
| Area_a | 2021.4 | 1 |
| Area_a | 2021.3 | 2 |
| Area_a | 2021.2 | 6 |
| Area_b | 2022.1 | 9 |
| Area_b | 2021.4 | 7 |
| Area_b | 2021.3 | 2 |
| Area_b | 2021.2 | 1 |
期望结果(核心为新增滚动求和行):
| 区域 | 季度 | 指标1 | 时间范围 |
|---|---|---|---|
| Area_a | 2022.1 | 5 | 季度值 |
| Area_a | 2021.4 | 1 | 季度值 |
| Area_a | 2021.3 | 2 | 季度值 |
| Area_a | 2021.2 | 6 | 季度值 |
| Area_a | 2022.1 | 14 | 12个月滚动 |
| Area_b | 2022.1 | 9 | 季度值 |
| Area_b | 2021.4 | 7 | 季度值 |
| Area_b | 2021.3 | 2 | 季度值 |
| Area_b | 2021.2 | 1 | 季度值 |
| Area_b | 2022.1 | 19 | 12个月滚动 |
解决方案(R语言)
假设你的季度汇总数据框名为quarter_df,可通过以下步骤实现:
- 为原始季度数据添加类型标识
library(dplyr) # 标记原始数据为"季度值" quarter_df <- quarter_df %>% mutate(时间范围 = "季度值")
- 计算每个区域的12个月滚动求和
如果数据中每个区域恰好只有4个季度(如示例),直接分组求和即可:
# 生成滚动求和数据 rolling_df <- quarter_df %>% group_by(区域) %>% arrange(Quarter) %>% # 确保季度按时间顺序排列 summarise( 季度 = last(Quarter), # 取最新季度作为滚动值的对应季度 指标1 = sum(指标1), 时间范围 = "12个月滚动" ) %>% ungroup()
如果数据集包含更多历史季度(超过4个),需用滚动窗口函数实现,可借助zoo包:
library(zoo) rolling_df <- quarter_df %>% group_by(区域) %>% arrange(Quarter) %>% # 计算向后滚动4个季度的和,不足4个的填充NA后过滤 mutate(指标1 = rollsumr(指标1, 4, fill = NA)) %>% filter(!is.na(指标1)) %>% mutate(时间范围 = "12个月滚动") %>% ungroup()
- 合并数据并排序
# 合并原始数据与滚动求和数据 final_df <- bind_rows(quarter_df, rolling_df) %>% # 按区域、季度倒序、数据类型排序,让滚动值紧跟对应区域的季度值 arrange(区域, desc(Quarter), 时间范围)
运行后final_df即为符合需求的结果。
内容的提问来源于stack exchange,提问作者user20012036
相关产品推荐
相关产品推荐

