2012-01-15 24 views
1

これはおそらく簡単な質問です。しかし、私は本当に苦労していますので、大変助かりました。4d配列を3次元配列に変換する方法

私は3dデータに変換したい4dデータを持っています。データには次の属性があります。

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で割って平均を得る非効率なループを書くことです。

私が試してみました:素敵な私ALL垂直レベルの平均を与えるが、わずか数の平均値を取得するために第3次元をサブセットする方法を理解することはできません

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は、三次元の最初の6つのレベルの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×73を返します12マトリックス。

+0

答えてくれてありがとう!私はそれは簡単だろうが、私は少し混乱していると思う! –

+0

これが実際に質問に答えた場合は、チェックマークを打つことによって他の読者に好意的にやってもらうことになります。 (私は現時点では余分なポイントが本当に必要なわけではありませんが、小切手を使用するまでは未回答の質問として表示され続けます)。 –

0

@DWinの回答に加えて、私はplyrパッケージをお勧めします。パッケージは、applyのような機能を提供します。 applyの肛門は、plyr関数aaplyです。 plyr関数の最初の2文字は、入力と出力のタイプを指定します(aaの場合)arrayarrayです。

> 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よりも遅いですが、いくつかの利点があります。パッケージは並列処理をサポートしており、結果はまたはlist(プロットの場合はggplot2)に出力され、進行状況バー(長時間実行されているプロセスに適しています)が表示されます。この場合、私はまだパフォーマンスのために申し込みをしていますが。

plyrパッケージの詳細については、this paperを参照してください。この例では、aaplyのパフォーマンスが悪いと誰かがコメントできますか?

関連する問題