使用R中的窗口进行峰值选择

时间:2014-06-03 09:22:25

标签: r subset apply

我有这样的数据集:

只有1个表,有2列。第一列从1到100,第二列有随机数。例如

x    y
1    25
2    51
3    250   
-    --
48   250
49   500
50   1000
-    ---       --and so on till
100  600

现在,我需要选择前50行(x = 1到x = 50)的窗口。取y对应于x = 50的y值(此处y = 1000表示x = 50)并取y(x = 50)与y(x = 49)的比值。它是1000/500 = 2 ..和y(x = 50)与y(x = 48)的比率..它是1000/250 = 4 ..依此类推,直到y(x = 50)到y(x = 1)然后取这五十个比率的平均值。

直到这部分,这很容易。

在此之后我需要将窗口移动1个位置,例如从x = 2到x = 51并重复所有内容,直到窗口达到x = 51到x = 100。

我在考虑使用时间序列window()函数或rle()函数或在for循环中使用subset()函数或使用apply()函数?什么是有效的方式?

2 个答案:

答案 0 :(得分:1)

您正在寻找rollapply

使用zoo包:

  library(zoo)
  tt <- zoo(runif(100),order.by=seq_len(100))
  rollapply(tt,width=50,
             function(x)mean(tail(x,1)/x[-length(x)]))

PS:忘记平均功能。

如果您有一些零值,可以使用ifesle检查分子:

filter_x <- 
  function(x){ vv = x[-length(x)]
               vv = ifelse(vv>0,vv,1)
               mean(tail(x,1)/vv)}

rollapply(tt,width=50,filter_x)

答案 1 :(得分:1)

rollapply()包中使用zoo

library(zoo)
set.seed(1)
foo <- runif(100)
foo[c(58,59)] <- 0
rollapply(foo,width=50,FUN=function(xx){
    foo <- xx[50]/xx[1:49]
    mean(foo[is.finite(foo)],na.rm=TRUE)
    }
)