2011-11-06 38 views
5

申請讓說我有一個數組,foo,R中具有尺寸== c(150, 40, 30)。 現在,如果我:反轉一個與rbind

bar <- apply(foo, 3, rbind) 

dim(bar)現在c(6000, 30)

什麼是最優雅和通用的方法來顛倒這個過程,並從barfoo,以便他們是相同的?

麻煩的是沒有得到尺寸正確,但得到的數據傳回在同一順序內它的尊重,原來,尺寸。

感謝您抽出寶貴時間,我期待着你的迴應。

P.S.對於那些認爲這是一個更大問題的一部分的人來說,它是,不,我現在還不能使用plyr

+0

你有看'aaply'?它通常在提供你期望的尺寸方面做得更好 – hadley

+0

對'rbind'的調用沒有意義 - 因爲你只給出它一個參數,它不會做任何有用的事情。 'identity'會做同樣的事情......我在下面的答案中擴展了這個觀察。 – 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

我想了解一下您最初的轉型。你叫從applyrbind,但不會做任何事情 - 你也可以同樣呼籲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 

那麼,你真的想完成什麼?我假設你有一對(30)矩陣切片,並想堆疊它們,然後再將它們拆散。如果是這樣,代碼會比@joran建議的更多。你需要一些調用aperm(如@Patrick伯恩斯建議):

# 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

好點,前兩個維度的分解基本上是我需要的。 'aperm'似乎起初有點古怪,但我會考慮它。這可能是最好的方法。謝謝你的建議。 – brews