我有这样的数据集:
只有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()函数?什么是有效的方式?
答案 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)
}
)