2014-09-30 56 views
1

我使用哈德利的reshape2包內的acast功能,扁平的數據集(從SQL Server查詢)轉變成一個術語文檔矩陣,像這樣:加快acast()調用創建矩陣

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

有沒有更快的(少內存密集型)方式來產生這個矩陣?

+0

如果你真的可以創建一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),它會有幫助,因爲我們不'無法訪問您的輸入。即使假數據也沒問題。你是否想從'tm'類中創建一個合適的'TermDocumenMatrix',或者你只是想創建自己的數組。也許使用'xtabs(...,sparse = TRUE)'會比'acast'更好的選擇來創建一個合適的'sparseMatrix()'對象。 – MrFlick 2014-09-30 23:59:23

+0

@MrFlick我已經更新了原始文件,並在我的公共Dropbox文件夾中鏈接到一個.csv文件。這應該是可重複的。 – Ray 2014-10-01 00:04:31

回答

2

我是一個不支持HTTPS在基礎R的系統中,這樣來訪問數據,我用

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 

所以結果是一樣的。

+0

今天我學到了什麼'xtabs'!感謝你!這很好用! – Ray 2014-10-01 00:36:36