如何用zoo包的rollmean计算带分组变量的比例数据移动平均
解决方案
1. 加载依赖包
先确保安装并加载所需的R包:
install.packages(c("dplyr", "zoo", "ggplot2")) library(dplyr) library(zoo) library(ggplot2)
2. 模拟样本数据
构造和你结构一致的测试数据(可替换为你的真实数据):
set.seed(123) dates <- seq(as.Date("2023-01-01"), as.Date("2023-01-30"), by = "day") variables <- c("Var1", "Var2", "Var3") # 生成每个日期各变量的比例值(总和为1) df <- expand.grid(date = dates, variable = variables) %>% group_by(date) %>% mutate(value = runif(n())) %>% mutate(value = value / sum(value)) %>% ungroup()
3. 按变量分组计算移动平均
使用group_by(variable)结合zoo::rollmean计算移动平均,注意先对日期排序(这是关键):
# 计算7天移动平均,窗口大小可按需调整 df_ma <- df %>% group_by(variable) %>% arrange(date) %>% # 确保每个变量的日期按顺序排列 mutate(ma_value = rollmean(value, k = 7, fill = NA, align = "right")) %>% ungroup() # 可选:填充开头的缺失值,避免绘图断层 df_ma <- df_ma %>% group_by(variable) %>% mutate(ma_value = na.fill(ma_value, "extend")) %>% ungroup()
4. 绘制堆叠面积图
用ggplot2生成符合需求的面积图:
ggplot(df_ma, aes(x = date, y = ma_value, fill = variable)) + geom_area(alpha = 0.7, position = "stack") + labs(x = "日期", y = "移动平均值", fill = "变量") + theme_minimal() + scale_fill_brewer(palette = "Set2")
关键注意事项
- 日期必须有序:计算移动平均前,一定要对每个变量分组内的日期排序,否则结果会混乱,这大概率是你之前用
group_by未得到理想结果的原因。 - 移动窗口参数:
rollmean的k是窗口大小,align = "right"表示用当前日期及之前的k-1个数据计算,符合常规移动平均逻辑。 - 缺失值处理:移动平均会在窗口覆盖不到的位置产生NA,可通过
fill参数或na.fill函数处理,避免绘图时出现断层。
内容的提问来源于stack exchange,提问作者Wasim
相关产品推荐
相关产品推荐

