我在R中使用rollapply
(来自zoo
包)来获取数据框中一系列行的滚动平均值。
对于焦点行为x
的每一行,我试图获得多种方法。我可以通过循环来做到这一点,但它很慢,我试图避免循环。
目标是获得4种不同规格的滚动方式:
x
,x-1
和x+1
的意思:“Rat3”x
到行x+7
的平均值:“RatE”x+8
到行x+15
的平均值:“RatL”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))
}
我可以使用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))
答案 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))
。