在R

时间:2017-11-02 15:15:41

标签: r moving-average

最小的例子是:

set.seed(42)
df <- data.frame(ID = rep("P1", 100),
                 treatment = c(rep("A", 50), rep("B", 50)),
                 t = rep(seq(1:50), 2),
                 x = rnorm(n = 100))
让我们想象一下,每秒测量一些价值。现在我也想要每个20秒窗口的平均值。所以1-2021-40,...(即没有重叠)

我的实际数据有一列ID代表多个主题,treatment带有两个处理的标签,实际时间列的增量为5(0,5,10,15,20)。还有其他重要的分组列。我拥有的值来自EEG录音,我需要增加窗口的大小以进行某些分析。

最干净的方法是什么?请注意,必须有一种方法可以知道计算出的平均值与哪个时间窗相关(只有20,40就足够了,而不是1-20的字符串)。

编辑: 根据我在这里删除的评论

df %>%
  mutate(timeWin = ceiling(.$t/20)*20) %>%
  group_by(ID, treatment, timeWin) %>%
  summarise(xAvg = mean(x))

只讨论那段代码才是ceiling的粗略用法。在上面的示例中,40-50支架将打印为60。

1 个答案:

答案 0 :(得分:0)

df$grouped_time = ave(df$t, ceiling(df$t/20), FUN = max)
aggregate(df["x"], df[c("ID", "treatment", "grouped_time")], mean)
#  ID treatment grouped_time           x
#1 P1         A           20  0.19192002
#2 P1         B           20  0.27873536
#3 P1         A           40 -0.27099180
#4 P1         B           40  0.01661547
#5 P1         A           50 -0.02021535
#6 P1         B           50 -0.08719458