2012-01-15 476 views
1

這裏可能是一個簡單的問題..但我真的很苦惱,所以非常感謝幫助。如何將四維數組轉換爲三維數組子集的其中一個維的特定元素

我有4d數據,我想轉換成3d數據。該數據具有以下屬性:

lon <- 1:96 
lat <- 1:73 
lev <- 1:60 
tme <- 1:12 

data <- array(runif(96*73*60*12), 
       dim=c(96,73,60,12)) # fill with random test values 

我想這樣做是計算出前幾個級別的均值(比如1:6)。新數據的格式如下:

new.data <- array(96*73*12), dim=c(96,73,12)) # again just test data 

但會包含前5個數據級的平均值。目前我唯一可以做到的方法是編寫一個相當低效的循環,提取前5個級別中的每一個,並將其中的總和除以5得到平均值。

我曾嘗試:

new.data <- apply(data, c(1,2,4), mean) 

這很好地給了我所有的垂直高度的平均值,但不能瞭解如何子集的第三維得到只有少數的平均!例如

new.data <- apply(data, c(1,2,3[1:5],4), mean) # which returns 
    Error in ds[-MARGIN] : only 0's may be mixed with negative subscripts 

我渴望得到一些幫助!

回答

3

apply與索引(正確使用「[」)應該是足夠的前六個級別的第三維的mean如果我理解您的術語:

> str(apply(data[,,1:6,] , c(1,2,4), FUN=mean)) 
num [1:96, 1:73, 1:12] 0.327 0.717 0.611 0.388 0.47 ... 

這將返回一個96 X 73由12矩陣。

+0

感謝您的回答!我雖然它會很簡單,但我覺得我有點困惑! – 2012-01-15 17:28:30

+0

如果這確實回答了這個問題,那麼通過點擊複選標記就可以爲其他讀者提供幫助。 (目前我並不需要額外的積分,但是在使用這張支票之前,這個問題會一直顯示爲「未解答的問題」。) – 2012-01-15 17:59:00

0

除了@DWin的回答,我會推薦plyr軟件包。該軟件包提供了apply類似的功能。 apply的analgue是plyr函數aaply。 plyr函數的前兩個字母指定輸入和輸出類型,在這種情況下爲aaarrayarray

> system.time(str(apply(data[,,1:6,], c(1,2,4), mean))) 
num [1:96, 1:73, 1:12] 0.389 0.157 0.437 0.703 0.61 ... 
    user system elapsed 
    2.180 0.004 2.184 
> Library(plyr) 
> system.time(str(aaply(data[,,1:6,], c(1,2,4), mean))) 
num [1:96, 1:73, 1:12] 0.389 0.157 0.437 0.703 0.61 ... 
- attr(*, "dimnames")=List of 3 
    ..$ X1: chr [1:96] "1" "2" "3" "4" ... 
    ..$ X2: chr [1:73] "1" "2" "3" "4" ... 
    ..$ X3: chr [1:12] "1" "2" "3" "4" ... 
    user system elapsed 
40.243 0.016 40.262 

在這個例子中它是比apply慢,但有幾個優點。這些軟件包支持並行處理,它還支持將結果輸出到data.framelist(用於使用ggplot2進行繪圖很好),並且它可以顯示進度條(適用於長時間運行的進程)。雖然在這種情況下,我仍然會因爲表演而申請。

有關plyr包的更多信息,請參閱this paper。在這個例子中,有人可以評論aaply的糟糕表現嗎?

相關問題