Вы можете сделать это довольно легко, используя combinations
из пакета gtools
:
result <- gtools::combinations(length(vec), L, vec)[, L:1]
Функция сама дает столбцы в возрастающем порядке, поэтому подмножество существует только для того, чтобы получить правильный порядок .
Это большая матрица, поэтому она занимает некоторое время, но только около 5 секунд на моей медленной работе P C:
microbenchmark::microbenchmark(combinations(22, 12, 21:0)[,12:1], times = 5)
Unit: seconds
expr min lq mean median uq max neval
combinations(22, 12, 21:0)[, 12:1] 4.965595 5.211964 5.261557 5.249413 5.341981 5.538831 5
Мы видим, что первые 5 строк дайте правильный формат:
result[1:5,]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#> [1,] 11 10 9 8 7 6 5 4 3 2 1 0
#> [2,] 12 10 9 8 7 6 5 4 3 2 1 0
#> [3,] 13 10 9 8 7 6 5 4 3 2 1 0
#> [4,] 14 10 9 8 7 6 5 4 3 2 1 0
#> [5,] 15 10 9 8 7 6 5 4 3 2 1 0
и что у нас правильные размеры:
dim(result)
#> [1] 646646 12