【问题标题】:How do I convert this sparse matrix to the normal one?如何将此稀疏矩阵转换为普通矩阵?
【发布时间】:2014-02-09 07:02:52
【问题描述】:

我有一个稀疏矩阵表示为

> (f <- data.frame(row=c(1,2,3,1,2,1,2,3,4,1,1,2),value=1:12))
   row value
1    1     1
2    2     2
3    3     3
4    1     4
5    2     5
6    1     6
7    2     7
8    3     8
9    4     9
10   1    10
11   1    11
12   2    12

此处第一列始终存在(实际上,前几列存在,其余不存在)。

我想把数据变成矩阵格式:

> t(matrix(c(1,2,3,NA,4,5,NA,NA,6,7,8,9,10,NA,NA,NA,11,12,NA,NA),nrow=4,ncol=5))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3   NA
[2,]    4    5   NA   NA
[3,]    6    7    8    9
[4,]   10   NA   NA   NA
[5,]   11   12   NA   NA

这似乎是有效的:

> library(Matrix)
> as.matrix(sparseMatrix(i = cumsum(f[[1]] == 1), j=f[[1]], x=f[[2]]))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    0
[2,]    4    5    0    0
[3,]    6    7    8    9
[4,]   10    0    0    0
[5,]   11   12    0    0

除非我必须自己将0 替换为NA

有没有更好的解决方案?

【问题讨论】:

  • 没有错。我只质疑as.matrixNA 的使用。如果您真的在使用大型稀疏矩阵,您应该停止在sparseMatrix
  • @flodel:它不大,也不是矩阵。我只使用sparseMatrix 进行解析。

标签: r matrix sparse-matrix


【解决方案1】:

您可以使用base 函数做任何事情。诀窍是通过 2-col(行和列索引)矩阵使用索引:

j <- f$row
i <- cumsum(j == 1)
x <- f$value
m <- matrix(NA, max(i), max(j))
m[cbind(i, j)] <- x
m

是否比使用Matrix 包更好是主观的。如果你不做任何其他事情,我认为矫枉过正。此外,如果您的数据在 f$value 列中有 0,如果您不太小心,它们最终会被转换为 NA

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2021-11-25
    • 2017-07-02
    • 2014-12-21
    • 2020-12-07
    • 1970-01-01
    • 2018-01-19
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多