按行名将稀疏模型矩阵绑定在一起

bind together sparse model matrices by row names

我正在尝试通过在数据帧的列子集上从包 Matrix 中单独调用 sparse.model.matrix() 然后将它们绑定在一起来使用拆分应用组合方法构建一个大型稀疏矩阵成一个完整的矩阵。由于内存限制,我必须这样做(我不能立即在整个 df 上调用 sparse.model.matrix)。这个过程运行良好,我得到了一个稀疏矩阵列表,但它们具有不同的维度,当我尝试将它们绑定在一起时,我做不到。

例如:

data(iris)
set.seed(100)
iris$v6 <- sample(c("a","b","c",NA), 150, replace=TRUE)
iris$v7 <- sample(c("x","y",NA), 150, replace = TRUE)

sparse_m1 <- sparse.model.matrix(~., iris[,1:5])
sparse_m2 <- sparse.model.matrix(~.-1, iris[, 6:7])

dim(sparse_m1)
[1] 150   7

dim(sparse_m2)
[1] 71  4

cbind2(sparse_m1, sparse_m2)
Error: Matrices must have same number of rows in cbind2(sparse_m1, sparse_m2)

cbind(sparse_m1, sparse_m2)
Error: Matrices must have same number of rows in cbind2(..1, r)

矩阵具有相同的行名,sparse_m2只是省略了一些行,因为它们在两列中都有缺失值。有什么办法可以结合起来吗?

我也尝试使用 plyr 包中的 rbind.fill.matrix(),首先转置然后调用它,然后重新转置,但随后我丢失了列名,因为行名在 rbind.fill.matrix.

有什么想法吗?

最近遇到了同样的问题,现在你可以

install.packages("Matrix.utils")
library(Matrix.utils)
sparse_filled <- rBind.fill(sparse_m1, sparse_m2)

一个老问题仍然需要答案...

一种方法是创建所需维度的空矩阵,然后填充它:

m12.dimnames<-list(union(rownames(sparse_m1),rownames(sparse_m2)),c(colnames(sparse_m1),colnames(sparse_m2)))
m12<- Matrix(0,nrow=length(m12.dimnames[[1]]),ncol=length(m12.dimnames[[2]]),dimnames=m12.dimnames)
m12[rownames(sparse_m2),colnames(sparse_m2)]<-sparse_m1
m12[rownames(sparse_m2),colnames(sparse_m2)]<-sparse_m2