应用其他参数语法

时间:2014-09-11 12:37:46

标签: r apply zoo rollapply

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

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?

1 个答案:

答案 0 :(得分:1)

说明:

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

由于一些原因(可能更多),这不起作用(并不是一个好主意):

  1. FUNapplyrollapply的正式论据。
  2. ...传递给rollapply 传递给mean
  3. 由于FUNapply的正式参数,因此它与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的{​​{1}}参数:

    rollapply