【问题标题】:Efficient way to convert CSV to Sparse Matrix in R在 R 中将 CSV 转换为稀疏矩阵的有效方法
【发布时间】:2012-09-04 19:16:15
【问题描述】:

我有一个非常大的 csv 文件(大约 9100 万行,因此 for 循环在 R 中花费的时间太长)关键字之间的相似性,当我读入 data.frame 时看起来像这样:

> 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 . .

我尝试使用 sparseMatrix(),但是将关键字名称转换为整数索引需要太多时间。

感谢您的帮助!

【问题讨论】:

  • 为什么你的问题有一个可能重复的标题?
  • 这是另一个帖子,抱歉。

标签: r csv sparse-matrix


【解决方案1】:

acast 来自 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
> 

使用Matrix 包中的sparseMatrix

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 的密集矩阵。
  • 也许如果我将 drop 设置为 true 它将是稀疏的。
  • 好的,这就像我之前对稀疏矩阵所做的那样。但是,我在将关键字转换为整数索引时遇到了问题,但我使用的是 apply 和 which 来执行 as.integer 在这里所做的事情。希望这会更快!
  • 不要错过factor() 步骤!这就是我强制as.integer 工作的方式以及dimnames 参数的工作方式。另外,如果我已经回答了您的问题,请单击复选标记将其标记为此类。这样其他人就知道问题已经解决了。
  • 我现在正在尝试将此矩阵转换为 dist 对象,但它会报告“问题太大”的错误。如果您有任何见解,我已经发布了另一个问题:stackoverflow.com/questions/12379233/… 感谢您的帮助!如果除了向上箭头之外还有其他评价你的答案,我很乐意这样做。
猜你喜欢
  • 2020-12-07
  • 2013-06-26
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多