Модификация функции expand.grid в R - PullRequest
4 голосов
/ 16 февраля 2020

Мне нужно создать матрицу всех возможных комбинаций.

L<-12 
vec <- c(0:21)
lst <- lapply(numeric(L), function(x) vec)
Mat1<-as.matrix(expand.grid(lst))

Результатом будет очень большая матрица, и мой компьютер не сможет ее вычислить. На самом деле мне нужны только комбинации, в которых значение в первом столбце больше значения во втором, во втором столбце больше, чем в третьем, и так далее. Могу ли я как-то изменить функцию expand.grid, чтобы удалить ненужные комбинации?

Ответы [ 2 ]

5 голосов
/ 16 февраля 2020

Как определил @AllanCameron, то, что вы ищете, эквивалентно принятию всех комбинаций vec размера 12 - вы также можете использовать встроенную функцию combn для этого:

do.call(rbind, combn(vec, L, simplify = FALSE))

Может быть быстрее использовать data.table для манипуляции с выводом combn в желаемый формат:

library(data.table)
setDT(transpose(combn(vec, L, simplify=FALSE))
3 голосов
/ 16 февраля 2020

Вы можете сделать это довольно легко, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...