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

R语言中面板数据的滚动均值与中位数计算问题

问题解决方案

原始面板数据

DateIDValue
MonA10
TueA11
WedA15
ThuA12
MonB11
TueB13
WedB12
ThuB13
MonC14
TueC10
WedC13
ThuC12

需求分析

需要新增一列RollingMean,计算基于全部3个ID的过去2个日期的所有数据的均值,并将该值分配给当前日期的所有ID;后续还需计算滚动中位数,以及绘制包含各ID数据和滚动均值的图表。

错误代码问题分析

你提供的代码报错原因是:group_by(Date)后每个分组仅包含3个Value,rollmean(Value, n=2)会返回2个结果,但mutate需要为每行生成1个值,长度不匹配导致报错。

正确实现代码

1. 加载依赖包

library(dplyr)
library(zoo)
library(ggplot2)

2. 预处理数据(确保日期顺序正确)

# 将Date转换为有序因子,保证Mon→Tue→Wed→Thu的顺序
df <- df %>%
  mutate(Date = factor(Date, levels = c("Mon", "Tue", "Wed", "Thu"), ordered = TRUE))

3. 计算滚动均值

# 步骤1:按日期聚合所有ID的Value
date_agg <- df %>%
  group_by(Date) %>%
  summarise(all_values = list(Value)) %>%
  arrange(Date)

# 步骤2:滑动窗口计算过去2个日期的所有Value的均值
date_rolling <- date_agg %>%
  mutate(
    # 窗口宽度为2,计算窗口内所有Value的均值,无足够数据时填充NA
    RollingMean = rollapply(
      all_values,
      width = 2,
      FUN = function(x) mean(unlist(x)),
      fill = NA,
      align = "left"
    )
  ) %>%
  # 将结果滞后1位,使当前日期对应过去2个日期的计算结果
  mutate(RollingMean = lag(RollingMean, 1))

# 步骤3:将滚动均值关联回原始数据
df_result <- df %>%
  left_join(date_rolling %>% select(Date, RollingMean), by = "Date")

执行后得到的结果与你提供的示例一致(Wed的RollingMean为11.5)。

4. 计算滚动中位数

只需将上述代码中的mean替换为median即可:

date_rolling_median <- date_agg %>%
  mutate(
    RollingMedian = rollapply(
      all_values,
      width = 2,
      FUN = function(x) median(unlist(x)),
      fill = NA,
      align = "left"
    )
  ) %>%
  mutate(RollingMedian = lag(RollingMedian, 1))

# 将滚动中位数关联回结果数据
df_result <- df_result %>%
  left_join(date_rolling_median %>% select(Date, RollingMedian), by = "Date")

5. 绘制趋势图

将各ID的Value与滚动均值绘制在同一张图中:

ggplot(df_result, aes(x = Date, y = Value)) +
  # 绘制各ID的Value折线与点
  geom_line(aes(color = ID, group = ID)) +
  geom_point(aes(color = ID)) +
  # 绘制滚动均值的虚线
  geom_line(aes(y = RollingMean, color = "Rolling Mean"), group = 1, linetype = "dashed", size = 1) +
  # 设置图表标签与样式
  labs(
    title = "各ID Value趋势与滚动均值",
    x = "日期",
    y = "数值",
    color = "系列"
  ) +
  theme_minimal()

内容的提问来源于stack exchange,提问作者Mining

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:04:52