R - 使用 ggplot2 在线条图中绘制不同时间序列的滚动平均值

api*_*sch 2 r ggplot2 zoo

我想用.绘制不同时间序列数据的滚动平均值ggplot2。我的数据具有以下结构:

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

df <- data.frame(episode=seq(1:1000), 
                 t_0 = runif(1000), 
                 t_1 = 1 + runif(1000), 
                 t_2 = 2 + runif(1000))
df.tidy <- gather(df, "time", "value", -episode) %>% 
  separate("time", c("t", "time"), sep = "_") %>%
  subset(select = -t)

> head(df.tidy)
#  episode time     value
#1       1    0 0.7466480
#2       2    0 0.7238865
#3       3    0 0.9024454
#4       4    0 0.7274303
#5       5    0 0.1932375
#6       6    0 0.1826925
Run Code Online (Sandbox Code Playgroud)

现在,下面的代码创建了一个图,其中时间 = 1 和时间 = 2 的线在剧集开始时不代表数据,因为value填充了 NA 并且第一个数字条目value是时间 = 0。

ggplot(df.tidy, aes(x = episode, y = value, col = time)) +
  geom_point(alpha = 0.2) + 
  geom_line(aes(y = rollmean(value, 10, align = "right", fill = NA)))
Run Code Online (Sandbox Code Playgroud)

绘图结果

我必须如何调整我的代码,使滚动平均线代表我的数据?

Jac*_*kes 5

您的问题是您在整列上应用移动平均值,这会使数据从一个值“泄漏”time到另一个值。

您可以group_by先分别将 应用于rollmean每次:

ggplot(df.tidy, aes(x = episode, y = value, col = time)) +
  geom_point(alpha = 0.2) + 
  geom_line(data = df.tidy %>%
              group_by(time) %>%
              mutate(value = rollmean(value, 10, align = "right", fill = NA)))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明