R中的嵌套循环,所有可能性

时间:2016-05-09 01:08:24

标签: r for-loop nested

我需要创建一个数据框,其中包含七个变量总和为100的所有可能性,每个变量可以是0到100。 我实现了以下代码,但需要很长时间。

combina <- function(U){
          d<- NULL
          for (i in 0:U) {
            for (j in 0:U) {
              for (k in 0:U) {
                for (l in 0:U) {
                  for (m in 0:U) {
                    for (n in 0:U) {
                      for (o in 0:U) {
                        if (i+j+k+l+m+n+o == U){
                          d <- rbind(d,c(i,j,k,l,m,n,o))
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        return(d)
        }

如你所见,我使用U变量进行测试,15之后需要永远...

2 个答案:

答案 0 :(得分:3)

这是我可以想到解决问题的一种方式(因为我不想创建100 ^ 7数据,因此规模要小得多)。 :)

例如,如果您有四个变量,范围从0到10,并且您想要找到它们的最多10个组合,那么您可以采用以下方法:

df <- expand.grid(a = 1:10, b = 1:10, c = 1:10, d = 1:10)
df[rowSums(df) == 10, ]

输出有10,000个(10 ^ 4)个可通过值中的84个值组合。

当然,这个解决方案看起来很简单,因为它首先创建并存储10,000 x 4数据帧。随着尺寸的增加,这将成为一个大问题。

  • 以下评论编辑。同意,它比apply更好,也许也更有效率。

答案 1 :(得分:3)

这是一个R函数,它产生k个非负整数的所有序列,总和为n。

sum_to_N <- function (n, k) {
  combos <- combn(seq(0, n+k-2), k-1)
  as.data.frame(t(rbind(combos, as.integer(n+k-1)) - rbind(0L, combos+1L)))
}

让我们看一个数字较小的例子。找到所有的解决方案 在非负整数中A + B + C + D = 10,我们首先找到不同数字的所有组合a&lt; b&lt; c在0和12之间,然后我们设置A = a,B = b - (a + 1),C = c - (b + 1),并且D = 13 - (c + 1)。一般来说,为了找到将n写成k个整数之和的所有方法,我们首先找到0到n + k-2之间的(k-1)个不同整数的所有组合。

解决方案的数量是(n + k-1)选择(k-1)。在这种情况下,n = 100且k = 7,因此解的数量是(106选择6)= 1,705,904,746。这可能是太多行以适应数据框,因此您应该尝试找到一个不涉及存储所有组合的问题的方法。