【问题标题】:R - data frame - convert to sparse matrixR - 数据框 - 转换为稀疏矩阵
【发布时间】:2015-01-16 11:40:36
【问题描述】:

我有一个大部分为零的数据框(稀疏数据框?)类似于

name,factor_1,factor_2,factor_3
ABC,1,0,0
DEF,0,1,0
GHI,0,0,1

实际数据约为 90,000 行,包含 10,000 个特征。我可以将其转换为稀疏矩阵吗?我希望通过使用稀疏矩阵而不是数据框来提高时间和空间效率。

任何帮助将不胜感激

更新 #1:这是一些生成数据框的代码。感谢理查德提供这个

x <- structure(list(name = structure(1:3, .Label = c("ABC", "DEF", "GHI"),
                    class = "factor"), 
               factor_1 = c(1L, 0L, 0L), 
               factor_2 = c(0L,1L, 0L), 
               factor_3 = c(0L, 0L, 1L)), 
               .Names = c("name", "factor_1","factor_2", "factor_3"), 
               class = "data.frame",
               row.names = c(NA,-3L))

【问题讨论】:

  • 您的代码对我不起作用。我相信是row.names

标签: r dataframe sparse-matrix


【解决方案1】:

您可以将第一列设为行名,然后使用 Matrix 包中的 Matrix

rownames(x) <- x$name
x <- x[-1]
library(Matrix)
Matrix(as.matrix(x), sparse = TRUE)
# 3 x 3 sparse Matrix of class "dtCMatrix"
#     factor_1 factor_2 factor_3
# ABC        1        .        .
# DEF        .        1        .
# GHI        .        .        1

原来的x数据框在哪里

x <- structure(list(name = structure(1:3, .Label = c("ABC", "DEF", 
"GHI"), class = "factor"), factor_1 = c(1L, 0L, 0L), factor_2 = c(0L, 
1L, 0L), factor_3 = c(0L, 0L, 1L)), .Names = c("name", "factor_1", 
"factor_2", "factor_3"), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • Richard 感谢您发布解决方案。快速的问题,为什么你把名字从第一列移到行名?
  • 好吧,我还不确定该怎么做。但如果可以做到,我会进行编辑以显示(或者其他人会发布更合适的答案)。
【解决方案2】:

避免将所有数据复制到密集矩阵中可能会提高内存效率(但速度较慢):

y <- Reduce(cbind2, lapply(x[,-1], Matrix, sparse = TRUE))
rownames(y) <- x[,1]

#3 x 3 sparse Matrix of class "dgCMatrix"
#         
#ABC 1 . .
#DEF . 1 .
#GHI . . 1

如果您有足够的内存,您应该使用 Richard 的答案,即将您的 data.frame 转换为密集矩阵,而不是使用 Matrix

【讨论】:

    【解决方案3】:

    我一直都这样做,这让我很头疼,所以我在我的 R 包中为它写了一个名为 sparsify() 的方法 - mltools。它在data.tables 上运行,这只是花哨的data.frames


    解决您的具体问题...

    安装mltools(或者只是将sparsify()方法复制到你的环境中)

    加载包

    library(data.table)
    library(Matrix)
    library(mltools)
    

    稀疏化

    x <- data.table(x)  # convert x to a data.table
    sparseM <- sparsify(x[, !"name"])  # sparsify everything except the name column
    rownames(sparseM) <- x$name  # set the rownames
    
    > sparseM
    3 x 3 sparse Matrix of class "dgCMatrix"
        factor_1 factor_2 factor_3
    ABC        1        .        .
    DEF        .        1        .
    GHI        .        .        1
    

    一般来说,sparse() 方法非常灵活。以下是一些如何使用它的示例:

    制作一些数据。注意数据类型和未使用的因子水平

    dt <- data.table(
      intCol=c(1L, NA_integer_, 3L, 0L),
      realCol=c(NA, 2, NA, NA),
      logCol=c(TRUE, FALSE, TRUE, FALSE),
      ofCol=factor(c("a", "b", NA, "b"), levels=c("a", "b", "c"), ordered=TRUE),
      ufCol=factor(c("a", NA, "c", "b"), ordered=FALSE)
    )
    > dt
       intCol realCol logCol ofCol ufCol
    1:      1      NA   TRUE     a     a
    2:     NA       2  FALSE     b    NA
    3:      3      NA   TRUE    NA     c
    4:      0      NA  FALSE     b     b
    

    开箱即用

    > sparsify(dt)
    4 x 7 sparse Matrix of class "dgCMatrix"
         intCol realCol logCol ofCol ufCol_a ufCol_b ufCol_c
    [1,]      1      NA      1     1       1       .       .
    [2,]     NA       2      .     2      NA      NA      NA
    [3,]      3      NA      1    NA       .       .       1
    [4,]      .      NA      .     2       .       1       .
    

    将 NA 转换为 0 并对其进行稀疏化

    > sparsify(dt, sparsifyNAs=TRUE)
    4 x 7 sparse Matrix of class "dgCMatrix"
         intCol realCol logCol ofCol ufCol_a ufCol_b ufCol_c
    [1,]      1       .      1     1       1       .       .
    [2,]      .       2      .     2       .       .       .
    [3,]      3       .      1     .       .       .       1
    [4,]      .       .      .     2       .       1       .
    

    生成标识 NA 值的列

    > sparsify(dt[, list(realCol)], naCols="identify")
    4 x 2 sparse Matrix of class "dgCMatrix"
         realCol_NA realCol
    [1,]          1      NA
    [2,]          .       2
    [3,]          1      NA
    [4,]          1      NA
    

    生成以最节省内存的方式识别 NA 值的列

    > sparsify(dt[, list(realCol)], naCols="efficient")
    4 x 2 sparse Matrix of class "dgCMatrix"
         realCol_NotNA realCol
    [1,]             .      NA
    [2,]             1       2
    [3,]             .      NA
    [4,]             .      NA
    

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 2021-12-14
      • 2023-04-10
      • 2021-11-25
      • 2017-07-02
      • 2020-04-07
      • 1970-01-01
      • 2012-08-15
      相关资源
      最近更新 更多