You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:31:38