2016-03-21 24 views
1

私は大きな問題を抱えています。より具体的な問題は、一度解決すればより大きな問題を解決できます。誰かが私に試してみるアイデアがあれば、本当に感謝しています。巨大な疎な行列をdata.tableに変換してより高速にサブセット化するR

基本的には、{slam}パッケージを使用して単純なトリプレットマトリックスとして保存され、実行している巨大な疎なマトリックス(約300k×150k、元はR's {tm}パッケージで作成されたTerm-Documentマトリックス)一連の用語をループし、それらの用語に基づいてサブセット化する関数です。残念ながら、サブセッティングプロセスは非常に遅いです。

より迅速にサブセット化する方法を見つけようとして、私はdata.tableパッケージを見つけました。このパッケージは、いくつかのテストでうまく実行されました。しかし、私はdata.tableに私のスパース行列を変換しようとすると、私は

Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA 
In addition: Warning message: 
In nr * nc : NAs produced by integer overflow 

を取得する私は、技術的にはR用のベクターである、それは最初の標準行列に変換しようとするため、これがあることを理解します300k * 150kは.Machine$integer.maxよりもかなり上です。

私の質問:単純なトリプレット行列をdata.frameまたはdata.tableに変換する方法を知っている人は、最初に行列に変換せずに整数オーバーフローを避ける方法を知っていますか?

もしそうでなければ、誰かが別の回避策を持っていますか、またはb)巨大な疎行列および/または単純な三重行列を素早くサブセット化するための助言がありますか?

以下は、周囲を混乱させる再現可能な例です。私のマシンでは、最初の10行のそれぞれを部分集合とするループは約3秒かかります。数十万行に及ぶループに入ると、すぐに禁止されます。助けを事前に感謝:

require(slam) 
STM <- simple_triplet_matrix(i = as.integer(runif(10000000,1,300000)), 
        j = as.integer(runif(10000000,1,150000)), 
        v = rep(rnorm(10), 1000000), 
        nrow = 300000, 
        ncol = 150000) 

start <- Sys.time() 
for (i in 1:10) { 
    vec <- as.matrix(STM[,i]) 
} 
Sys.time() - start 

追記:あなたはSTMm <- as.matrix(STM)を試す場合は、私が上記示した同じオーバーフローエラーを取得していることに気づきます。

+1

ほとんど瞬間的です最初の2列の非ゼロ要素の座標と3列目の値を含むベクトル。可能なアプローチ(私はそれをテストしませんでした)は、3つのベクトルのリストとしてC++にトリプレットを渡して、C++でサブセット化アルゴリズムを書くためにRCppパッケージを使うことです。 Rでできることは何でもできるはずです – dww

答えて

4

STMオブジェクトが実際にリストだけで、あなたが正常にサブセットすることができます:

STM_DT <- data.table(i = STM$i, j = STM$j, v = STM$v)

これは与える:

> STM_DT 
       i  j   v 
     1: 186598 756 0.34271080 
     2: 278329 72334 2.03924976 
     3: 178388 32708 1.03925605 
     4: 260635 101424 0.05780086 
     5: 169321 126202 1.00027529 
     ---       
9999996: 96209 90019 -1.09341023 
9999997: 54467 16612 -2.08070273 
9999998: 179029 96906 -0.86197333 
9999999: 153017 148731 0.47765003 
10000000: 104145 123291 0.24258613 

スピード三重項マトリックスは、本質的に3である

+0

ありがとうございます。それは素晴らしいことです。 – seth127

関連する問題