2016-03-10 41 views
0

我有這樣的矩陣:主叫rollapply使用矩陣的每一列應用

> mtrx <- matrix(c(1:30), nrow=10) 
> mtrx 
     [,1] [,2] [,3] 
[1,] 1 11 21 
[2,] 2 12 22 
[3,] 3 13 23 
[4,] 4 14 24 
[5,] 5 15 25 
[6,] 6 16 26 
[7,] 7 17 27 
[8,] 8 18 28 
[9,] 9 19 29 
[10,] 10 20 30 
> is.matrix(mtrx) 
[1] TRUE 

我可以apply函數(在這種情況下mean)到每一列這樣:

> apply(mtrx, 2, mean) 
[1] 5.5 15.5 25.5 

我還可以將rollapply函數用於特定列(在本例中爲第1列)

> require(zoo) 
> rollapply(mtrx[,1], width = 2, by = 2, FUN = mean, align = "left") 
[1] 1.5 3.5 5.5 7.5 9.5 

如何結合上述方法並在每個矩陣列上執行rollapply?我試過以下:

> apply(mtrx, 2, rollapply, width = 2, by = 2, FUN = mean, align = "left") 
Error in mean.default(newX[, i], ...) : 
    'trim' must be numeric of length one 

而且還提出方法here

> apply(mtrx, 2, function(x) rollapply(width = 2, by = 2, FUN = mean, align = "left")) 
Error in index(x) : argument "data" is missing, with no default 

但兩者給我的,我不明白的錯誤。

+0

關於錯誤,'apply'和'rollapply'都有一個'FUN'參數,所以你指定'FUN'代替'rollapply',因此所有的參數都被傳遞給「mean」函數代替「rollapply」函數 - 因此錯誤來自「mean」(「trim」是它的一個參數)。 –

+0

@ G.Grothendieck和@DavidArenburg好的,我不需要使用'apply'我明白了。無論如何,如何將參數傳遞給'rollapply'而不是'apply',以及如何讓'rollapply'在矩陣行而不是列上運行(是't()'一種可能的解決方案)?我在問,因爲如果知道我原來的問題的答案,那麼我可以輕鬆實現這兩個目標。謝謝。 –

+1

如果你想在行上操作,將MARGIN設置爲1.在你的情況下,你需要編寫一個匿名函數,例如apply(mtrx,1,function(x)rollapply(x,width = 2, by = 2,FUN = mean,align =「left」))'(類似於你的最後一次嘗試,你忘記了將'x'傳遞給'rollapply'.雖然也許'rollapply'提供了一個內置的解決方案IDK。正如所指出的,更好地閱讀「?rollapply」的文檔。 –

回答

1

從評論中移除。

你不需要applyrollapply已經作用於矩陣中的每一列默認:

rollapply(mtrx, width = 2, by = 2, FUN = mean, align = "left") 

?rollapply

此外,您的代碼不起作用的原因是FUN=mean被視爲傳遞給apply的功能,而不是功能傳遞到rollapply

相關問題