如何将此稀疏矩阵转换为正常矩阵?

时间:2014-02-09 07:02:53

标签: r matrix sparse-matrix

我有一个表示为

的稀疏矩阵
> (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

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用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