【问题标题】:R - reordering a sparse matrix by rownamesR - 按行名重新排序稀疏矩阵
【发布时间】:2015-10-12 04:03:11
【问题描述】:

我有三个使用 Matrix 包构建的 dgCMatrix 稀疏矩阵。 这两个矩阵的行顺序不同,所以我想按行名重新排序,这样我就可以将三个矩阵加在一起。 有人能提示一下快速执行此操作的方法吗?

非常感谢,

尼古拉斯

这是一个小例子,其中 ZZ 是错误的,因为矩阵的顺序不同:

dat <-data.frame(fac1=factor(c("small","large"),levels=c("small","large","medium")),fac2=factor(c("medium","large"),levels=c("medium","large","small")),fac3=factor(c("small","medium"),levels=c("small","medium","large")))

Zl <- lapply(c("fac1","fac2","fac3"), function(nm) Matrix:::fac2sparse(dat[[nm]], "d",drop=F))

ZZ <- Reduce("+", Zl[-1], Zl[[1]])

【问题讨论】:

  • 我认为我不会更改存储在稀疏矩阵中的条目序列中的任何内容。对于普通的矩阵或数据框,下面的解决方案肯定有效,但我不确定在更改行的顺序后,dgCMatrix 中非零元素的索引是否仍然有意义。

标签: r sparse-matrix


【解决方案1】:

为了更清楚,我添加了一个虚拟示例。 感谢您的回答 Mikkel,它实际上可以使用:

Z1 <- Matrix:::fac2sparse(dat$fac1, "d",drop=F)
Z1 <- Z1[order(row.names(Z1)),]

Z2 <- Matrix:::fac2sparse(dat$fac2, "d",drop=F)
Z2 <- Z2[order(row.names(Z2)),]

Z3 <- Matrix:::fac2sparse(dat$fac3, "d",drop=F)
Z3 <- Z3[order(row.names(Z3)),]

ZZ <- Z1+Z2+Z3

我发现另一种解决方案是在使用 lapply 之前对因子的级别进行排序:

dat$fac1 <- factor(dat$fac1,levels=sort(levels(dat$fac1))
dat$fac2 <- factor(dat$fac2,levels=sort(levels(dat$fac2))
dat$fac3 <- factor(dat$fac3,levels=sort(levels(dat$fac3))

Zl <- lapply(c("fac1","fac2","fac3"),function(nm) Matrix:::fac2sparse(dat[[nm]],"d",drop=F))

ZZ <- Reduce("+", Zl[-1], Zl[[1]])

【讨论】:

    【解决方案2】:

    我在网站上找到了这个解决方案:

    new_df <- df[ order(row.names(df)), ]
    

    链接:How can I use the row.names attribute to order the rows of my dataframe in R?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 2013-11-29
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2012-01-10
      相关资源
      最近更新 更多