-2

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

感谢您的时间和帮助!

4

2 回答 2

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只计算第二个参数定义的组内第一个参数的平均值。因此,对于这个使用组 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
于 2013-06-28T01:20:49.417 回答
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

想法:创建一个新的分组变量(由data.table的一部分)使用findIntervalmean根据这个新的分组变量计算坐标y。

编辑汇总结果:

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
于 2013-06-28T01:41:35.613 回答