2012-09-11 161 views
1

我有一個非常大的csv文件(大約9100萬行,因此for循環花費的時間太長)R的關鍵字之間的相似性,當我讀入data.frame看起來像:將CSV轉換爲R中稀疏矩陣的有效方法

> df 
kwd1 kwd2 similarity 
a b 1 
b a 1 
c a 2 
a c 2 

這是一個稀疏的名單,我想將它轉化成一個稀疏矩陣:

> myMatrix 
    a b c 
a . 1 2 
b 1 . . 
c 2 . . 

我嘗試使用稀疏矩陣(),但轉換的關鍵字名稱爲整數索引需要太多時間。

感謝您的幫助!

+0

爲什麼你對你的問題*可能重複*頭? –

+0

這是來自不同的帖子,對不起。 – rfoley

回答

1

acast from reshape2包將很好地做到這一點。有基本的R解決方案,但我覺得語法要困難得多。

library(reshape2) 
df <- structure(list(kwd1 = structure(c(1L, 2L, 3L, 1L), .Label = c("a", 
"b", "c"), class = "factor"), kwd2 = structure(c(2L, 1L, 1L, 
3L), .Label = c("a", "b", "c"), class = "factor"), similarity = c(1L, 
1L, 2L, 2L)), .Names = c("kwd1", "kwd2", "similarity"), class = "data.frame", row.names = c(NA, 
-4L)) 

acast(df, kwd1 ~ kwd2, value.var='similarity', fill=0) 

    a b c 
a 0 1 2 
b 1 0 0 
c 2 0 0 
> 

使用sparseMatrixMatrix包:

library(Matrix) 
df$kwd1 <- factor(df$kwd1) 
df$kwd2 <- factor(df$kwd2) 

foo <- sparseMatrix(as.integer(df$kwd1), as.integer(df$kwd2), x=df$similarity) 

> foo 
3 x 3 sparse Matrix of class "dgCMatrix" 


foo <- sparseMatrix(as.integer(df$kwd1), as.integer(df$kwd2), x=df$similarity, dimnames=list(levels(df$kwd1), levels(df$kwd2))) 

> foo 

3 x 3 sparse Matrix of class "dgCMatrix" 
    a b c 
a . 1 2 
b 1 . . 
c 2 . . 
+0

嗯,我會試試這個。但是,這會給我一個稀疏矩陣嗎?內存不會允許0的密集矩陣。 – rfoley

+0

也許如果我設置爲真,它將是稀疏的。 – rfoley

+0

@RyanEFOley看到我編輯sparseMatrix' – Justin