2012-03-23 78 views
4

這是一個擴展到現有的問題:Convert table into matrix by column names的R - 轉換大表到矩陣的列名

我用最後的答案:https://stackoverflow.com/a/2133898/1287275

原來的CSV文件矩陣具有約1.5M的行三列......行索引,列索引和一個值。所有數字都是長整數。基礎矩陣是一個約220K x 220K的稀疏矩陣,每行平均約有7個值。

最初的read.table工作得很好。

x <- read.table("https://stackoverflow.com/users/wallace/Hadoop_Local/reference/DiscoveryData6Mo.csv", header=TRUE); 

我的問題來了,當我做重塑命令。

reshape(x, idvar="page_id", timevar="reco", direction="wide") 

CPU達到100%,它在那裏永遠存在。機器(Mac)擁有比R更多的內存。我不明白爲什麼需要這麼長時間來構建一個稀疏矩陣。

我正在使用默認的矩陣包。我沒有安裝任何額外的東西。我幾天前剛剛下載了R,所以我應該有最新版本。

對此提出建議?

感謝, 華萊士

+0

你應該從'Matrix'軟件包試一下'sparseMatrix'。 – flodel 2012-03-23 01:45:24

+3

無論您對_deus_ex_machina_做出什麼樣的犧牲,'reshape'函數都不是用來構造spars矩陣的。並沒有「矩陣」包。如果您詢問「Matrix」軟件包,請正確拼寫。 – 2012-03-23 01:49:48

+1

http://stackoverflow.com/a/9617424/210673有執行此操作的各種方法的列表。 – Aaron 2012-03-23 15:54:07

回答

3

我會用sparseMatrix函數從Matrix包。典型用法是sparseMatrix(i, j, x)其中i,jx是三個具有相同長度的向量:行索引,col索引和矩陣中非零元素的值。這裏就是我試圖變量名稱和尺寸符合您的要求的例子:

num.pages <- 220000 
num.recos <- 230000 
N   <- 1500000 

df <- data.frame(page_id = sample.int(num.pages, N, replace=TRUE), 
       reco = sample.int(num.recos, N, replace=TRUE), 
       value = runif(N)) 
head(df) 
# page_id reco  value 
# 1 33688 48648 0.3141030 
# 2 78750 188489 0.5591290 
# 3 158870 13157 0.2249552 
# 4 38492 56856 0.1664589 
# 5 70338 138006 0.7575681 
# 6 160827 68844 0.8375410 

library("Matrix") 
mat <- sparseMatrix(i = df$page_id, 
        j = df$reco, 
        x = df$value, 
        dims = c(num.pages, num.recos)) 
+0

謝謝。這非常有幫助! – Wallace 2012-05-21 18:36:31

1

在基礎R要做到這一點,最簡單的方法是用矩陣索引,就像這樣:

# make up data 
num.pages <- 100 
num.recos <- 100 
N <- 300 
set.seed(5) 
df <- data.frame(page_id = sample.int(num.pages, N, replace=TRUE), 
       reco = sample.int(num.recos, N, replace=TRUE), 
       value = runif(N)) 

# now get the desired matrix 
out <- matrix(nrow=num.pages, ncol=num.recos) 
out[cbind(df$page_id, df$reco)] <- df$value 

然而,在這種情況下,您的結果矩陣將爲220k * 220k,這會佔用比您更多的內存,因此您需要使用專門用於稀疏矩陣的包,如@ flodel所述。