2

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

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

目的是获得 4 种不同规格的滚动装置:

  1. x,x-1x+1: "Rat3"的平均值
  2. x逐行的平均值x+7:“RatE”
  3. x+8行的平均值x+15:“RatL”
  4. x行的平均值x+15:“RatJ”

使用循环我可以得到所有这些,但它很慢:

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)) 
}

我可以使用以下功能获得 Rat3 rollapply

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))
4

2 回答 2

1

我认为您正在寻找align可以设置为'center','left'或的参数'right',但默认为'left'.

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

于 2016-06-02T10:13:29.667 回答
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

于 2016-06-02T13:22:08.127 回答