如何在R中迭代生成组合?

时间:2013-07-16 17:36:29

标签: r loops iteration combinations

所以我目前正在使用以下代码生成我的组合:

combn(X,Y)

但问题是该功能存储了所有可能的组合。我不想存储它们,我只想通过循环或其他东西来制作它们。这对我的计划来说会更有效率。有没有办法通过for循环生成组合而不是全部存储?

我知道我在这里问了一个类似的问题: How do I find all possible subsets of a set iteratively in R?

但在该解决方案中,组合仍在存储......

以下是一些更详细的信息:

让我们说我想找到4选择2. combn(4,2)基本上会存储以下内容: ((1,4),(1,3),(1,2),(2,4),(2,3)(3,4))

我想要的是:

   loop{
       produces one combination at a time 
   }

3 个答案:

答案 0 :(得分:1)

如果目标是将每个组合用作某些计算的输入,您可能希望使用FUN的{​​{1}}参数,la combn。似乎这不会存储组合,但仍然会立即返回应用于每个组合的函数的结果。

以下是虚拟函数的示例:

apply

答案 1 :(得分:0)

要在循环中一次一个地返回每个的可能组合,请执行以下操作:

#Sample data:
x <- c(1,2,3,4)
y <- 2
all_combinations <- combn(x,y)

#Return each value:
for (i in 1:ncol(all_combinations)) {
  print(all_combinations[,i])
}

但是我不确定你为什么要在for循环中这样做,因为它很慢。超出此应用程序是否有理想的最终输出?

答案 2 :(得分:0)

这是一个建议,它允许根据循环的前一次迭代中使用的组合为循环的当前迭代生成组合。

## 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