使用rollapply()获取特定/自定义行的平均值

时间:2016-06-02 09:54:28

标签: r rollapply

我在R中使用rollapply(来自zoo包)来获取数据框中一系列行的滚动平均值。

对于焦点行为x的每一行,我试图获得多种方法。我可以通过循环来做到这一点,但它很慢,我试图避免循环。

目标是获得4种不同规格的滚动方式:

  1. xx-1x+1的意思:“Rat3”
  2. x到行x+7的平均值:“RatE”
  3. x+8到行x+15的平均值:“RatL”
  4. x到行x+15的平均值:“RatJ”
  5. 使用循环我可以得到所有这些,但它很慢:

    tempDF = data.frame(sample(c("A","B"), replace = T, size = 100),rnorm(100,10,2))
    colnames(tempDF) = c("Cohort","Rat")
    
    for(i in 1:length(tempDF$Cohort)){
           tempDF$Rat3[i] = (mean(tempDF$Rat[(i-1):(i+1 )], na.rm = FALSE)) 
           tempDF$RatE[i] = (mean(tempDF$Rat[(i+0):(i+7 )], na.rm = FALSE)) 
           tempDF$RatL[i] = (mean(tempDF$Rat[(i+8):(i+15)], na.rm = FALSE)) 
           tempDF$RatJ[i] = (mean(tempDF$Rat[(i+0):(i+15)], na.rm = FALSE)) 
    }
    

    我可以使用rollapply函数获取Rat3:

    tempDF$Rat3 = c(0,rollapply(tempDF$Rat, 3, FUN = mean, by = 1),0)
    

    但我坚持如何修改它以使其不以价值$ x $为中心,而是使用$ x $(或$ x + 8 $)作为滚动平均值的起点。如何设置rollapply函数来操纵它“移动”滚动平均窗口的方式?

    这是一个不优雅的解决方案:

    tempDF$RatE = c(0,0,0,0,rollapply(tempDF$Rat, 8, FUN = mean, by = 1),0,0,0)
    tempDF$RatE = c(tempDF$RatE[5:(length(tempDF$RatE)-3)],rep("0",times=7))
    

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找align参数,该参数可以设置为'center''left''right',但默认为'left'。< / p>

顺便说一句,你是否预先分配了四个结果向量?这通常会使循环变慢。

答案 1 :(得分:0)

Rat3问题中的两个解决方案并不相同。 Rat3[1] mean(Rat[1:2])在第一个Rat3解决方案(使用循环)中为0,在第二个Rat3解决方案rollapply中使用# roll is convenience function so we don't have to repeat some args 4 times roll <- function(...) rollapply(FUN = mean, na.rm = FALSE, fill = 0, ...) transform(tempDF, Rat3 = roll(Rat, 3), RatE = roll(Rat, 8, align = "left"), RatL = roll(Rat, list(8:15)), RatJ = roll(Rat, 16, align = "left") ) transform(tempDF, Rat3 = roll(Rat, list(c(-1, 0, 1))), RatE = roll(Rat, list(0:7)), RatL = roll(Rat, list(8:15)), RatJ = roll(Rat, list(0:15)) ) )。假设你想要填零(如在第二个解决方案中):

?rollapply

这也有效:

rollapply

有关struct X { int x, y, z, p, q, r; X(): x{}, y{}, z{}, p{}, q{}, r{} { } // cumbersome //X(): X{} { } // the idea is nice but doesn't compile }; 参数的详细信息,请参阅memset(this, 0, sizeof(*this))