【问题标题】:bind together sparse model matrices by row names按行名将稀疏模型矩阵绑定在一起
【发布时间】:2015-10-19 02:23:29
【问题描述】:

我正在尝试通过在数据帧的列子集上分别从包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 中忽略了行名。

有什么想法吗?

【问题讨论】:

  • 如何绑定两个行数不同的矩阵?
  • 它们具有相同的行名
  • 我在想可能不是 cbind,有没有一种简单的方法可以以三元组形式重新表示 dgCmatrix,然后将三元组连接在一起?

标签: r sparse-matrix


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是另一个问题的答案。请注意,OP 想要 cbind,而不是 rbind 结果,
    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2019-11-04
    • 2015-10-12
    • 2012-01-10
    • 2023-04-10
    • 2021-11-25
    • 2017-07-02
    相关资源
    最近更新 更多