我有一个表示为
的稀疏矩阵> (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
。
有更好的解决方案吗?
答案 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
。