R - 按列名称将BIG表转换为矩阵

时间:2012-03-23 01:40:01

标签: r sparse-matrix

这是对现有问题的扩展: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,所以我应该有最新的版本。

建议?

谢谢, 华莱士

2 个答案:

答案 0 :(得分:4)

我会使用sparseMatrix包中的Matrix函数。典型用法为sparseMatrix(i, j, x),其中ijx是三个相同长度的向量:分别为行索引,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所描述的那样。