计算固定间隔中可变数量坐标的值的平均值

时间:2013-06-28 00:54:23

标签: r aggregate

我想计算固定间隔(例如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

感谢您的时间和帮助!

2 个答案:

答案 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