【问题标题】:Speeding up acast() call to create matrix加快 acast() 调用以创建矩阵
【发布时间】:2023-10-13 05:35:01
【问题描述】:

我正在使用 Hadley 的 reshape2 包中的 acast 函数将扁平数据集(从 SQL Server 查询)转换为术语文档矩阵,如下所示:

## Load packages
require("reshape2")
require("plyr")
require("RODBC")
require("lsa")

## Get flattened term-frequency data:
Terms <- read.csv(url("https://dl.dropboxusercontent.com/u/263772/flat_dtm.csv"), header = T)
names(Terms) <- c("id", "Term", "Frequency")

system.time(terms.mtrx <- acast(Terms, id ~ Term, sum, value.var = 'Frequency')) # re-cast to a term-document matrix

我遇到的问题是terms.mtrx 的尺寸非常大...... 40,000 行 x 17,000 列,而且矩阵非常稀疏。

> head(Terms)
                      id                      Term Frequency
1 resume-108008-34530496           enterprise data         2
2 resume-108008-34530496 enterprise data warehouse         2
3 resume-108008-34530496                       etl         2
4 resume-108008-34530496                  facility         1
5 resume-108008-34530496                   faculty         1
6 resume-108008-34530496                 financial         1
>
> dim(Terms)
[1] 6139039       3

有没有更快(占用内存更少)的方法来生成这个矩阵??

【问题讨论】:

  • 如果您能真正创建一个reproducible example 将会很有帮助,因为我们无法访问您的输入。即使是假数据也可以。您是在尝试像在 tm 的课程中​​那样制作正确的 TermDocumenMatrix,还是只是在尝试制作自己的数组。也许使用xtabs(..., sparse=TRUE) 会比acast 更好的选择来创建一个合适的sparseMatrix() 对象。
  • @MrFlick 我已经更新了原始文件,并在我的公共 Dropbox 文件夹中添加了一个 .csv 文件的链接。因此,这应该是可重现的。

标签: r plyr reshape2


【解决方案1】:

我是一个在base R中不支持https的系统,所以为了访问数据,我使用了

library(httr)
Terms <-content(GET("http://dl.dropboxusercontent.com/u/263772/flat_dtm.csv"))
names(Terms) <- c("id", "Term", "Frequency")

然后我比较了acastxtabs(...,sparse=TRUE)

system.time(terms.mtrx <- acast(Terms, id ~ Term, sum, value.var = 'Frequency'))
#    user  system elapsed 
#   9.253   0.199   9.662 

system.time(terms.mtrx2 <- xtabs(Frequency~id+Term, Terms, sparse=TRUE))
#    user  system elapsed 
#   0.083   0.009   0.092 

我们可以看到

all(terms.mtrx == terms.mtrx2)
# [1] TRUE

所以结果是一样的。

【讨论】:

  • 今天我了解了xtabs 的作用!谢谢你!这很好用!