2014-09-11 40 views
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 

的错误是这样,因为意味着本身需要额外的参数?我怎么能够通过所有的参数rollapply申请然后呢?

回答

0

说明:

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

这是不行的(而不是一个好主意)的一对夫妇的原因(也许更多):

  1. FUN是一个正式的说法既applyrollapply
  2. ...分别传递给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) 

这意味着apply循环内的mean电话是:

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) 
+0

好的,谢谢!我现在预先定义了该功能,但我只是想更好地了解应用的结构... 感谢您的理解! – jtanman 2014-09-12 12:57:00