2017-10-16 67 views
2

我期待總結矩陣中所有可能的行組合。功能類似於rowSums()功能,但不會產生nrow()總和,它會產生nrow()^nrow()總和。如何對Matrix中的所有行進行求和?

例如:

set.seed(10) 
dummymat <- matrix(floor(runif(9, 0, 2)), nrow = 3, ncol = 3) 

產生矩陣:

 [,1] [,2] [,3] 
[1,] 1 1 0 
[2,] 0 0 0 
[3,] 0 0 1 

爲了找到該矩陣的每一個可能的行總和,下面的非常低效的代碼可以被寫成:

allrowsums <- c() 

for(i in 1:nrow(dummymat)) { 
    firstcolval <- dummymat[i,1] 
    for(j in 1:nrow(dummymat)) { 
    secondcolval <- dummymat[j,2] 
    for(k in 1:nrow(dummymat)) { 
     thirdcolval <- dummymat[k,3] 
     rowsum <- firstcolval + secondcolval + thirdcolval 
     allrowsums <- append(allrowsums,rowsum) 
    } 
} 
} 

這給出了以下輸出:

[1] 2 2 3 1 1 2 1 1 2 1 1 2 0 0 1 0 0 1 1 1 2 0 0 1 0 0 1 

我可以爲更大的矩陣編寫更簡潔的代碼嗎?

回答

4

您可以使用expand.grid來創建所有列元素組合的數據框。

dummymat_expand <- expand.grid(x=dummymat[,1], y=dummymat[,2], z=dummymat[,3]) 

從這裏,你可以調用rowSums來獲得所有可能的總和組合。

rowSums(dummymat_expand) 

編輯回答問題。要將代碼應用於具有可變列長度的矩陣,請注意expand.grid可以將向量,因子或列表作爲輸入。因此,您可以創建列元素的列表喂到expand.grid

# create a list of column elements 
dummymat_column_list <- lapply(1:ncol(dummymat), function(x) dummymat[, x]) 
expand.grid(dummymat_column_list) 
+0

感謝這個@Djork,你能想到如何使答案的動態,使得它可以處理任何柱長度的矩陣? (並且代碼不需要每次調整)。對於100列的矩陣,此答案的代碼也會變得相當長。 –

+1

我編輯了答案來解決你的問題。如果這適用於您,請接受答案以標記它。 – Djork

+0

謝謝@Djork,很抱歉成爲PITA,但由於看起來內存消耗,此解決方案無法處理更大的矩陣。嘗試使用'dummymat < - matrix(floor(runif(5000,0,2)),nrow = 1000,ncol = 5)' –

相關問題