【问题标题】:R - convert BIG table into matrix by column namesR - 按列名将 BIG 表转换为矩阵
【发布时间】:2012-03-23 01:40:00
【问题描述】:

这是对现有问题的扩展:Convert table into matrix by column names

我使用的是最终答案:https://stackoverflow.com/a/2133898/1287275

原始的 CSV 文件矩阵有大约 150 万行,三列...行索引、列索引和一个值。所有数字都是长整数。底层矩阵是一个大小约为 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,所以我应该有最新版本。

建议?

谢谢, 华莱士

【问题讨论】:

  • 你应该试试Matrix包中的sparseMatrix
  • reshape 函数并非设计用于构造一个spars-矩阵,无论您对deus_ex_machina做出什么牺牲。并且没有“矩阵”包。如果您询问的是“Matrix”包,请正确拼写。
  • stackoverflow.com/a/9617424/210673 列出了执行此操作的各种方法。

标签: r sparse-matrix


【解决方案1】:

我会使用 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))

【讨论】:

  • 谢谢。这很有帮助!
【解决方案2】:

在基数 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 所述。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2015-04-27
    • 2017-12-22
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多