2014-09-11 43 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