Существует несколько пакетов, специально созданных для этого.
Первый пакет arrangements
:
## sequence is a bad name as it is a base R function so we use s instead
s <- c(1,0,1,0)
arrangements::permutations(unique(s), length(s), freq = table(s))
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 0 1 0
[3,] 1 0 0 1
[4,] 0 1 1 0
[5,] 0 1 0 1
[6,] 0 0 1 1
Далее у нас есть RcppAlgos
(я автор):
RcppAlgos::permuteGeneral(unique(s), length(s), freqs = table(s))
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 0 1 0
[3,] 1 0 0 1
[4,] 0 1 1 0
[5,] 0 1 0 1
[6,] 0 0 1 1
Они оба очень эффективны. Чтобы дать вам представление, что для реальной потребности со стороны OP другие методы потерпят неудачу (я думаю, что есть ограничение на число строк для матрицы ... 2 ^ 31 - 1, хотя не уверен), или возьмите очень долго, так как им придется генерировать 16! ~= 2.092e+13
перестановок перед дальнейшей обработкой. Однако с этими двумя пакетами возврат мгновенный:
## actual example needed by OP
sBig <- c(0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1)
system.time(a <- arrangements::permutations(unique(sBig), length(sBig), freq = table(sBig)))
user system elapsed
0.001 0.001 0.002
system.time(b <- RcppAlgos::permuteGeneral(unique(sBig), length(sBig), freqs = table(sBig)))
user system elapsed
0.001 0.001 0.002
identical(a, b)
[1] TRUE
dim(a)
[1] 11440 16