我有一个R稀疏矩阵(非常大。转换为完整矩阵不可行),我想识别/消除重复列,如果存在的话。类似于唯一(x,MARGIN = 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