R - 根据列名将大型表格转换为矩阵

5
这是对现有问题的扩展:按列名将表格转换为矩阵 我正在使用最终答案:https://dev59.com/1kvSa4cB1Zd3GeqPfIUi#2133898 原始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,所以应该是最新版本。

有什么建议吗?

谢谢, Wallace


你应该尝试使用Matrix包中的sparseMatrix - flodel
3
“reshape”函数不适用于构建稀疏矩阵,无论你对“deus_ex_machina”做了什么牺牲。而且没有名为“matrix”的软件包。如果您在询问“Matrix”软件包,则请正确拼写它。 - IRTFM
1
https://dev59.com/HWkw5IYBdhLWcg3w1eC7#9617424 上有各种实现此操作的方法列表。 - Aaron left Stack Overflow
2个回答

5
我会使用Matrix包中的sparseMatrix函数。典型用法为sparseMatrix(i, j, x),其中ijx是长度相同的三个向量:分别表示矩阵中非零元素的行索引、列索引和值。以下是一个示例,我尽量匹配变量名称和规格要求:
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))

3
在基础 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所描述的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接