干得好:
test <- data.frame(one=c(2,2,2,3,4,5,5,6),two=c(3,4,5,1,2,1,2,8))
window.size <- 2
test$window.mean <- ave(
test$two,
findInterval(
test$one,
seq(min(test$one),max(test$one),window.size)
)
)
aggregate(window.mean ~ one, data=test, FUN=head, 1)
one window.mean
1 2 3.250000
2 3 3.250000
3 4 1.666667
4 5 1.666667
5 6 8.000000
给出一些解释这是如何工作的:
如果您在此示例中使用 2 的窗口定义了一些切点:
> seq(min(test$one),max(test$one),2)
[1] 2 4 6
然后findInterval
只标记定义的切割点之间的组。
> findInterval(test$one,seq(min(test$one),max(test$one),2))
[1] 1 1 1 1 2 2 2 3
> test$one
[1] 2 2 2 3 4 5 5 6
ave
只计算第二个参数定义的组内第一个参数的平均值。因此,对于这个使用组 fromfindInterval
和值 from 的示例test$two
,您最终得到:
#groups
[1] 1 1 1 1 2 2 2 3
#values
[1] 3 4 5 1 2 1 2 8
mean(c(3,4,5,1)) = 3.25
mean(c(2,1,2)) = 1.66
mean(c(8)) = 8