2012-04-24 34 views
1

我希望獲得4維數組中最大值爲1的行的百分比。我可以使用apply函數爲第四維的各個值獲取該信息,然後使用cbind組合所有輸出。但是,第四維中的值的數量可能會有所不同。有沒有一種有效的方式來獲得所需格式的輸出而不使用cbind?R:組合輸出應用於數組維度的各個值

下面是函數代碼,它將所需信息作爲數組第四維的每個級別的單獨向量返回。

set.seed(9345) 

A <- 8 
B <- 2 
C <- 5 
D <- 2 # the value of D might change 

y2 <- array(rbinom(A*B*C*D, 1, 0.4), dim = c(A, B, C, D)) 

pA <- colMeans(apply(y2[,,,1], c(1,3), max)) 
pB <- colMeans(apply(y2[,,,2], c(1,3), max)) 

pp <- cbind(pA, pB) 
pp 

#  pA pB 
# [1,] 0.750 0.875 
# [2,] 0.625 0.250 
# [3,] 0.375 1.000 
# [4,] 0.375 0.500 
# [5,] 0.625 0.750 

有一種簡單的方式來獲得PP的等效,而不使用cbind上(結合了應用和colMeans功能也許一襯墊)的輸出Pa和Pb?如果第四維(D)中的值數量發生變化,那麼必須與cbind組合的向量數量會有所不同。

謝謝你的任何建議。

+0

你張貼無需編輯不工作的代碼。 (你設置了一個對象'y',但是然後在'y2'上進行操作。)如果你做了'y2 < - y',那麼結果矩陣就不會如圖所示。 (它反而匹配下面我的答案中的那個)。 – 2012-04-24 23:44:42

+0

是的,我看到並修復了它。對於那個很抱歉。 – 2012-04-24 23:50:12

回答

4

這應該是等價的,簡單的啓動:

colMeans(apply(y2[,,,], c(1,3,4), max)) 
#  [,1] [,2] 
# [1,] 0.750 0.875 
# [2,] 0.625 0.250 
# [3,] 0.375 1.000 
# [4,] 0.375 0.500 
# [5,] 0.625 0.750 
+0

感謝您的回答。我想如果我使用c(1,3,4)我不需要t():colMeans(apply(y2 [,,,],c(1,3,4),max))。 – 2012-04-25 00:00:05

+0

@MarkMiller - 感謝您的支持(現在修復)。 (當我困惑爲什麼'c(1,3,4)'不符合你發佈的結果時,我所運行的實驗就剩下了!) – 2012-04-25 00:45:57