1

假设我有一个包含数据列的数据框,我想计算每列的单边移动平均值。为什么这行得通

my.rollapply <- function(x){

    return(rollapply(x,moving.avg,FUN= mean, fill = NA,align = 'right', na.rm = TRUE))

}

averageData <- apply(averageData, 2, my.rollapply)

averageData <- apply(averageData, 2, rollapply, width = moving.avg, FUN = mean, fill = NA, align = 'right', na.rm = TRUE)

给我一个错误

Error in mean.default(newX[, i], ...) : 
  'trim' must be numeric of length one

这是因为平均值本身需要额外的参数吗?那么,我如何能够将所有参数传递给 apply 内部的 rollapply 呢?

4

1 回答 1

1

解释:

averageData <- apply(averageData, 2, rollapply, width = moving.avg,
                     FUN = mean, fill = NA, align = 'right', na.rm = TRUE)

由于几个原因(也许更多),这不起作用(也不是一个好主意):

  1. FUN是 和 的正式apply论证rollapply
  2. ...are 被传递给rollapply 传递给mean

由于FUN是 的正式参数apply,因此它与调用匹配,apply而不是传递...rollapply调用。所以你的apply电话被解释为:

apply(X=averageData, MARGIN=2, FUN=mean, rollapply, width=moving.avg,
      fill=NA, align='right', na.rm=TRUE)

这意味着循环mean内的调用是:apply

mean(tmp[,i], ...)
# which is equivalent to
mean(tmp[,i], rollapply, width=moving.avg, fill=NA, align='right', na.rm=TRUE)

失败是因为trim参数是rollapply,它是一个函数,而不是长度为 1 的数值向量。

解决方案:

无论如何,解决这个问题的简单方法是使用 的by.column参数rollapply

library(xts)
data(sample_matrix)
x <- as.zoo(sample_matrix)
y <- rollmeanr(x, k=moving.avg, fill=NA, na.rm=TRUE, by.column=TRUE)
于 2014-09-11T13:08:02.563 回答