我想计算固定间隔(例如2)的坐标(第1列)的值(第2列)的平均值.但是,具有值的坐标的数量是可变的.我也想尝试不同大小的窗户.
数据示例(标签分隔)
2 3
2 4
2 5
3 1
4 2
5 1
5 2
6 8
Run Code Online (Sandbox Code Playgroud)
窗口大小为2的所需输出(我们每移动两个X值)
x mean window
2 3.25 2-3
3 3.25 2-3
4 1.66 4-5
5 1.66 4-5
6 8 6-7
Run Code Online (Sandbox Code Playgroud)
感谢您的时间和帮助!
干得好:
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
Run Code Online (Sandbox Code Playgroud)
为了解释它是如何工作的:
如果在此示例中使用2的窗口定义一些切割点,则:
> seq(min(test$one),max(test$one),2)
[1] 2 4 6
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
ave只计算第二个参数定义的组中第一个参数的平均值.因此,对于此示例使用from findInterval和来自的值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
Run Code Online (Sandbox Code Playgroud)