【问题标题】:Applying a function to a few rows then the next few rows将函数应用于几行然后接下来的几行
【发布时间】:2013-05-30 13:06:23
【问题描述】:

我试图找到 nrows(df) 的最大行数 2:5、3:6、4:7 等等。然而,我在思考如何做到这一点时遇到了问题,因为我过去从未成功使用过 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 行,依此类推,并将其放在新列中。

谢谢

【问题讨论】:

    标签: r apply zoo


    【解决方案1】:

    您可以通过制作列的三个副本(即“高”)并偏移它们来做到这一点,这样一个开始在一个值之前,一个在一个值之后开始。然后在遍历它们时取最大值:

    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 - rollapply 可能是最好的方法,但这很好地说明了矢量思维,它使 R 中的很多事情变得更容易。最后缺失的部分:@987654325 @ 功能。 pmax(t, tback, tforward, na.rm = TRUE) 给出相同的结果。
    【解决方案2】:

    使用动物园功能“rollapply”解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多