私は非常に大きな疎な行列(1.000.000 * 1.000.000)を私の修士論文に扱っています。私はRを、より正確にはこの問題に特化した 'Matrix'パッケージを使用します。疎行列を塗りつぶすときにループを避ける
基本的に私の質問は:既存のデータフレーム全体をループせずに疎マトリックスを埋める既存のテクニックはありますか?私のスパース行列が値0を取らないインデックスを抽出するより効率的な方法はありますか?
私はこの質問をするのは初めてではありませんが、ほとんどのスレッドはMatlabまたはPythonに関係しており、明確な答えは見つかりませんでした。
この問題についていくつかの説明をしましょう。
私はこの形式のデータフレームDfとがあるとします。
list1 <- list("a","b","c")
list2 <- list("b,c","c", NA)
Df <- data.frame(cbind(list1, list2))
Df
list1 list2
1 a b,c
2 b c
3 c NA
私はDfを[jは、1] Dfのに表示されている場合、スパース行列Sを割り当て、S [I、J] = 1を構築したいです[i、2]。従って行列Sは、この形式であろう:
S=matrix(c(0,0,0,1,0,0,1,1,0), nrow=3)
S
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 0 0 1
[3,] 0 0 0
はDfとのそれぞれの行と列をスキャンループを記述することなく、このマトリックスを充填することが可能ですか?
は確かに、現時点では、私のコードは次のようなもののようになります。
row_vector <- vector()
col_vector <- vector()
val_vector <- vector()
count = 0
for (i in 1:3){
for (j in 1:3){
if (grepl(Df[i,1], Df[j,2], fixed=TRUE)==TRUE){
count=count+1
col_vector[count]=i
row_vector[count]=j
val_vector[count]=1
}
}
}
これは私が小行列を持っている場合罰金ですが、大きなマトリックスとはかなり退屈かもしれません。
私は十分にはっきりしていたと思います。助けやアドバイスに感謝します。 ?sparseMatrix
- あなたは、このような質問をする前に、ドキュメントを読んでする必要が
よろしく、 ジェルマン
有効なR構文を使用してサンプルデータを共有できますか?私はあなたの "マトリックス" Mによって非常に混乱しました、ダッシュは何を表していますか?なぜ列数が異なるように見えますか? 'b'と' c'文字列はありますか?あなたが行列 'M =行列(c(1,2,3,4)、nrow = 2)を持っているとすれば、あいまいさはありません。構文を共有して作成することもできますし、ワークスペースに適切な(そして小さな)オブジェクトがある場合は 'dput(M)'を共有するだけです。 – Gregor
は 'M'です。あなたは' Df'として何を作成しましたか? – Spacedman
グレゴール、私は私の質問を編集しました。今ははっきりしているはずです。 @Spacedmanはい、本当にありがとうございます。私はそれに応じて私のメッセージを編集しました。 –