Я нашел этот спасительный код, созданный @QuantIbex. Он создает комбинации переменных итеративно для использования в al oop, не генерируя их заранее и не сохраняя их.
Первый ответ здесь
## Function definition
gen.next.cbn <- function(cbn, n){
## Generates the combination that follows the one provided as input
cbn.bin <- rep(0, n)
cbn.bin[cbn] <- 1
if (tail(cbn.bin, 1) == 0){
ind <- tail(which(cbn.bin == 1), 1)
cbn.bin[c(ind, ind+1)] <- c(0, 1)
}else{
ind <- 1 + tail(which(diff(cbn.bin) == -1), 1)
nb <- sum(cbn.bin[-c(1:ind)] == 1)
cbn.bin[c(ind-1, (n-nb+1):n)] <- 0
cbn.bin[ind:(ind+nb)] <- 1
}
cbn <- which(cbn.bin == 1)
}
## Example parameters
n <- 6
k <- 3
## Iteration example
for (i in 1:choose(n, k)){
if (i == 1){
cbn <- 1:k
}else{
cbn <- gen.next.cbn(cbn, n)
}
print(cbn)
}
# [1] 1 2 3
# [1] 1 2 4
# [1] 1 2 5
# [1] 1 2 6
# [1] 1 3 4
# [1] 1 3 5
# [1] 1 3 6
# [1] 1 4 5
# [1] 1 4 6
# [1] 1 5 6
# [1] 2 3 4
# [1] 2 3 5
# [1] 2 3 6
# [1] 2 4 5
# [1] 2 4 6
# [1] 2 5 6
# [1] 3 4 5
# [1] 3 4 6
# [1] 3 5 6
# [1] 4 5 6
Сам код выходит за рамки моих собственных технических возможностей в R. Я смог адаптировать его для своего использования и вставить свой анализирует в l oop и работает очень хорошо. Одна из вещей, которую я не смог понять, это как сделать так, чтобы go было выполнено более чем по x числу переменных на комбинацию за раз.
В приведенном выше коде n = количество переменных для использоваться для генерации комбинаций. k = количество переменных в комбинации. В примере k = 3. Я могу изменить k на все, что захочу, но есть ли способ для k равный диапазон, такой как k = 3: 10?
Я устанавливаю значения:
n <- 31
k <- 3:10
Это останавливается однажды с комбинациями 3 и дает мне следующее:
Warning messages:
1: In 1:choose(n, k) :
numerical expression has 8 elements: only the first used
2: In 1:k : numerical expression has 8 elements: only the first used
Я знаю, что многие люди предупреждают о том, насколько медленными являются петли, и, вероятно, предупредят меня, что комбинации из 10 будут длиться вечно, но это вещи, которые я принимаю.