我想计算固定间隔(例如2)的坐标(第1列)的值(第2列)的平均值。但是,具有值的坐标的数量是可变的。我也想尝试不同大小的窗户。
数据示例(标签分隔)
2 3
2 4
2 5
3 1
4 2
5 1
5 2
6 8
大小为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
感谢您的时间和帮助!
答案 0 :(得分:5)
你走了:
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
只计算第二个参数定义的组中第一个参数的平均值。因此,对于此示例,使用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
答案 1 :(得分:3)
这是一个data.table
解决方案,使用findInterval
但语法糖为data.table
:
library(data.table)
DT <- as.data.table(dat)
window.size <- 2
DT[, m:= mean(V2), findInterval(V1, seq(min(V1),max(V1),window.size))]
V1 V2 m
1: 2 3 3.250000
2: 2 4 3.250000
3: 2 5 3.250000
4: 3 1 3.250000
5: 4 2 1.666667
6: 5 1 1.666667
7: 5 2 1.666667
8: 6 8 8.000000
想法:使用findInterval
创建一个新的分组变量(按部分data.table),并根据这个新的分组变量计算坐标y的mean
。
编辑汇总结果:
DT[, list(unique(V1),value = mean(V2)),
findInterval(V1, seq(min(V1),max(V1),window.size))]
findInterval V1 value
1: 1 2 3.250000
2: 1 3 3.250000
3: 2 4 1.666667
4: 2 5 1.666667
5: 3 6 8.000000