2017-10-16 7 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はベクトル、因数またはリストを入力として使用できることに注意してください。あなたはそれゆえ、この@Djorkため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

おかげに供給する列要素のリストを作成することができ、あなたはそれが任意の列の長さの行列を扱うことができるよう、その答えを動的にする方法を考えることができますか? (コードは毎回調整する必要はありません)。 100列の行列の場合、この答えのコードもかなり長くなります。 –

+1

私はあなたの質問に答えるための答えを編集しました。これがうまくいく場合は、回答を受け入れて、近くにマークしてください。 – Djork

+0

おかげさまで@Djork、PITAになることは申し訳ありませんが、このソリューションはメモリ消費のために大きな行列を扱うことができません。例えば、 'dummymat < - matrix(floor(runif(5000,0,2)、nrow = 1000、ncol = 5)' –

関連する問題