2011-11-06 9 views
5

私は、配列がfooで、寸法が== c(150, 40, 30)であると言います。今 、I場合:rbindで適用を逆にする

bar <- apply(foo, 3, rbind) 

dim(bar)は今c(6000, 30)です。

この手順を逆にして、barからfooになる最もエレガントで一般的な方法は何ですか?

問題は正しい次元を得ることではなく、尊重されたオリジナルの次元の中で同じ順序でデータを戻すことです。

時間をいただきありがとうございます、私はあなたの応答を楽しみにしています。

P.S.これが大きな問題の一部であると考えている人にとっては、それはありますし、いいえ、私はplyrをまだ使用することはできません。

+0

'aaply'を見ましたか?それは通常あなたが期待する次元を与えるより良い仕事をします – hadley

+0

'rbind'への呼び出しは意味をなさない - あなたはそれに1つの引数しか与えないので、何も役に立たないでしょう。 「同一性」は同じことをするでしょう...私は以下の答えでこの観察を拡大しました。 – Tommy

答えて

7

私はあなただけで再びarrayを呼び出すと、元の大きさを指定することができると思う:

m <- array(1:210,dim = c(5,6,7)) 
m1 <- apply(m, 3, rbind) 
m2 <- array(as.vector(m1),dim = c(5,6,7)) 
all.equal(m,m2) 
[1] TRUE 
+0

うーん、私はこれを試したと思ったが、これはうまく動作するので、それらの夜の一つでなければならない。親切にありがとう! – brews

+3

データの順序によっては、次元が正しくない配列を作成してから 'aperm'を使用する必要があります。 –

4

私はあなたの最初の変換に疑問を抱いています。あなたはrbindapplyから呼び出しますが、それは何もしません。あなたはidentityと呼ぶこともできます。

foo <- array(seq(150*40*30), c(150, 40, 30)) 
bar <- apply(foo, 3, rbind) 
bar2 <- apply(foo, 3, identity) 
identical(bar, bar2) # TRUE 

これは本当に達成したかったのですか?私は、あなたが2つ(30)のマトリックススライスを持っていて、それらを積み重ねてから再び積み重ねることを前提としていました。もしそうなら、コードは@joranよりも複雑になるはずです。 (@Patrickバーンズが示唆したように)あなたはapermにいくつかの呼び出しが必要になります。いずれにせよ

# Make a sample 3 dimensional array (two 4x3 matrix slices): 
m <- array(1:24, 4:2) 

# Stack the matrix slices on top of each other 
m2 <- matrix(aperm(m, c(1,3,2)), ncol=ncol(m)) 

# Reverse the process 
m3 <- aperm(array(m2, c(nrow(m),dim(m)[[3]],ncol(m))), c(1,3,2)) 

identical(m3,m) # TRUE 

apermは本当に強力(とやや混乱)です。十分に学習価値があります...

+0

良い点は、最初の2つの次元を分解することは本質的に必要なことです。 'aperm'は最初はちょっと奇妙に見えますが、私はそれを調べます。それが最良の方法かもしれません。ご提案いただきありがとうございます。 – brews

関連する問題