将函数应用于几行然后接下来的几行

时间:2013-05-30 13:06:23

标签: r apply zoo

我试图找到最大行2:5,然后是3:6,然后是4:7,依此类推nrow(df)。然而,我在思考如何做到这一点时遇到了问题,因为我过去从未成功使用for循环。非常感谢任何帮助。

structure(c(76.89, 77.08, 77.05, 77.28, 77.28, 77.61, 77.03, 
77.61, 77.28, 77.3, 77.37, 77.61, 76.7, 77, 76.98, 77.09, 77.21, 
77.5, 76.74, 77.49, 76.98, 77.2, 77.29, 77.58, NA, 76.91, 77.27, 
77.13, 77.24, 77.45, NA, 0.910154726303475, 0.0129416332341208, 
0.220407104887854, 0.168306576903153, 0.20658489347966, NA, 0.117019893381879, 
-0.3753073637893, -0.0518604952677195, -0.0388399792853642, 0.0645577792123914
), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class =  c("xts", 
"zoo"), index = structure(c(631324800, 631411200, 631497600, 
631756800, 631843200, 631929600), tzone = "UTC", tclass = "Date"), .Dim = 6:7, .Dimnames = list(
NULL, c("open", "high", "low", "close", "avgco", "percenthigh", 
"percentlow")))

具体来说,我想在AD1 $ high列上应用max函数,用于第2行到第5行,然后是第3行到第6行,依此类推,并将其放在新列中。

谢谢

2 个答案:

答案 0 :(得分:2)

你可以通过制作你的列的三个副本(即“高”)并使它们偏移来实现它,这样一个值从一个值开始,一个值从一个值开始。然后只需在迭代它们时取最大值:

y <- yourdata

t <- y[,"high"]
tback <- t[2:length(t)]
tforward <- append(NA,t)

使用循环

for(i in 1:length(t)) {
    maxvals[i] <- max(c(t[i],tback[i],tforward[i]), na.rm=T)
}

输出

> maxvals
[1] 77.61 77.61 77.61 77.37 77.61 77.61

或者你可以通过将maxvals初始化为适当的长度并填充其值来更有效地完成它。

答案 1 :(得分:2)

使用zoo函数“rollapply”解决了我的问题。