这是对现有问题的扩展:Convert table into matrix by column names
我正在使用最终答案:https://stackoverflow.com/a/2133898/1287275
原始CSV文件矩阵有大约1.5M行,有三列...行索引,列索引和值。所有数字都是长整数。底层矩阵是一个大小约为220K x 220K的稀疏矩阵,平均每行约7个值。
原始的read.table工作正常。
x <- read.table("/users/wallace/Hadoop_Local/reference/DiscoveryData6Mo.csv", header=TRUE);
当我执行reshape命令时出现问题。
reshape(x, idvar="page_id", timevar="reco", direction="wide")
CPU达到100%并且它永远存在。机器(mac)的内存比R使用的内存多。我不明白为什么构建稀疏矩阵需要这么长时间。
我正在使用默认的矩阵包。我还没有安装任何额外的东西。我几天前刚刚下载了R,所以我应该有最新的版本。
建议?
谢谢, 华莱士
答案 0 :(得分:4)
我会使用sparseMatrix
包中的Matrix
函数。典型用法为sparseMatrix(i, j, x)
,其中i
,j
和x
是三个相同长度的向量:分别为行索引,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))
答案 1 :(得分: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所描述的那样。