R - 消除稀疏矩阵中的重复列

时间:2015-03-09 01:30:20

标签: r matrix unique sparse-matrix

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

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

2 个答案:

答案 0 :(得分:0)

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

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<-paste(DFSummary$i,DFSummary$x,sep=':'),然后将ix值存储在dupeList中。

答案 1 :(得分:0)

一种选择是在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