2013-06-28 90 views
-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 

感谢您的时间和帮助!

+6

也许我今天很迟钝,但什么是数据和所需输出之间的关系?我不清楚。 – thelatemail

+0

这个想法是让每个位置的值(第一列)具有平均值,如果不太清楚,我很抱歉。 – LeonLara

+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 

举是如何工作的一些解释:

> seq(min(test$one),max(test$one),2) 
[1] 2 4 6 

如果使用2的窗口,在这个例子中定义了一些砍分

然后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 
+0

优秀的使用'findInterval',我忘记了+1 – agstudy

+0

感谢您的回答,这正是我想要的,我很抱歉在开始的时候感到困惑。你能解释我,如果你可以如何组合大声和findInterval的作品?谢谢! – LeonLara

+0

@LeonLara - 没有问题,我给了一些更多的解释。希望能帮助到你。 – thelatemail

3

这里一个data.table解决方案,使用findIntervaldata.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 
+0

太好了,谢谢! – LeonLara

+0

在'data.table'中是否有一个'aggregate'等价物可以在这里应用? – thelatemail

+0

@thelatemail我不太清楚'聚合',但我的编辑是否有意义? – agstudy