【问题标题】:R - eliminating duplicate columns in a sparse MatrixR - 消除稀疏矩阵中的重复列
【发布时间】:2015-03-09 01:30:20
【问题描述】:

我有一个 R 稀疏矩阵(非常大。转换为完整矩阵不可行),如果存在重复列,我想识别/消除重复列。类似于 unique(x,MARGIN=2),但它在稀疏矩阵上运行。

周围有这样的东西吗? 关于如何做的建议?

【问题讨论】:

    标签: r matrix unique sparse-matrix


    【解决方案1】:

    我也没有找到一个很好的解决方案,但这就是我用过的。

    library(data.table)
    DFSummary<-summary(DF)
    DT<-data.table(DFSummary)
    setkey(DT,j)
    nDF<-ncol(DF)
    
    dupeList<- list()
    dupeList[[nDF]]=NULL
      for(k in 1:nDF){
      dupeList[[k]]<-sort(DT[j==k,i])
      if(k%%1000==0) print (k/nDF)
      }
    
    dupeVec<-duplicated(dupeList)
    dupes<-which(dupeVec==TRUE)
    

    请记住,此解决方案仅适用于二进制矩阵。如果你有一个数字矩阵,你可以做一些事情,比如将 i 索引粘贴到 x 值。例如 DFSummary$ix&lt;-paste(DFSummary$i,DFSummary$x,sep=':'),然后将ix值存储在dupeList中。

    【讨论】:

      【解决方案2】:

      一种选择是使用包 mgcv 中转置的 uniquecombs,然后转置矩阵。该函数适用于稀疏矩阵,但返回一个密集矩阵。如果您使用的矩阵太大,这可能会导致您出现内存问题。

      set.seed(123)
      n <- 500
      p <- 10/n
      pDup <- 1/100
      DupRow <- sample(c(1, 0), n, prob = c(p, 1-p), replace = TRUE)
      IsDup <- sample(c(1, 0), n, prob = c(pDup, 1-pDup), replace = TRUE)
      sum(IsDup)
      # 5
      myBigMat <- 
           Reduce(cbind2, lapply(IsDup, 
                                      function(x) {
                                        if (x) {
                                          toFill <- DupRow
                                        } else {
                                          toFill <- sample(c(1, 0), n, prob = c(p, 1-p), replace = TRUE)
                                        }
                                        Matrix(toFill,nrow = n, ncol = 1, sparse = TRUE) 
                                      }
                                      ))
      
      NoDuplicateCols <- t(Matrix(mgcv::uniquecombs(t(myBigMat)), sparse = TRUE))
      dim(NoDuplicateCols)
      # 500 496
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        相关资源
        最近更新 更多