2017-11-27 7 views
0

私は非常に大きな疎な行列(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 - あなたは、このような質問をする前に、ドキュメントを読んでする必要が

よろしく、 ジェルマン

+0

有効なR構文を使用してサンプルデータを共有できますか?私はあなたの "マトリックス" Mによって非常に混乱しました、ダッシュは何を表していますか?なぜ列数が異なるように見えますか? 'b'と' c'文字列はありますか?あなたが行列 'M =行列(c(1,2,3,4)、nrow = 2)を持っているとすれば、あいまいさはありません。構文を共有して作成することもできますし、ワークスペースに適切な(そして小さな)オブジェクトがある場合は 'dput(M)'を共有するだけです。 – Gregor

+0

は 'M'です。あなたは' Df'として何を作成しましたか? – Spacedman

+0

グレゴール、私は私の質問を編集しました。今ははっきりしているはずです。 @Spacedmanはい、本当にありがとうございます。私はそれに応じて私のメッセージを編集しました。 –

答えて

0

コンストラクタには、行インデックス、列インデックス、および値の3つのベクトルを指定する必要があります。今度は、データからインデックスと値を取得する方法を考える必要があります。

+0

私はRで1ヶ月間コーディングしているので、私は明らかに専門家ではありません。私はあなたのメッセージを得ることは確かではありません。私は疎な行列が何であるかを理解しており、ドキュメントをスキャンしました。私は私の質問のポイントが正確だと思います:データフレーム全体をループせずにインデックスと値を取得できますか?経験豊富なコーダーは、どのようにこれを解決しますか?おそらく私には何かがありません。 –

関連する問題