Одним из вариантов является использование uniquecombs транспонирования в пакете mgcv, а затем транспонирование матрицы. Функция работает на разреженной матрице, но возвращает плотную матрицу. Это может вызвать проблемы с памятью, если матрица, с которой вы работаете, слишком велика.
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