R语言中面板数据的滚动均值与中位数计算问题
问题解决方案
原始面板数据
| Date | ID | Value |
|---|---|---|
| Mon | A | 10 |
| Tue | A | 11 |
| Wed | A | 15 |
| Thu | A | 12 |
| Mon | B | 11 |
| Tue | B | 13 |
| Wed | B | 12 |
| Thu | B | 13 |
| Mon | C | 14 |
| Tue | C | 10 |
| Wed | C | 13 |
| Thu | C | 12 |
需求分析
需要新增一列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
相关产品推荐
相关产品推荐

