最小的例子是:
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-20
,21-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。
答案 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