R 中具有新时间 window 的分组移动平均线

Grouped moving average with new time window in R

一个最小的例子是:

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 秒的平均值 window。所以 1-2021-40、...(即没有重叠)

我的实际数据有一个列 ID 表示多个受试者,treatment 带有两个处理的标签,实际时间列以 5 (0, 5, 10, 15, 20 ).还有其他重要的分组列。我的值来自 EEG 记录,我需要增加 window 的大小以进行某些分析。

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

编辑: 根据我在此处获得的现已删除的评论

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

那段代码的唯一问题是 ceiling 的使用相当粗暴。在上面的示例中,40-50 括号将打印为 60。

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