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

R中的嵌套循环,所有可能性,r,for-loop,nested,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) {

我需要做一个数据框,它有所有的可能性,其中七个变量加起来是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)
        }

combina这是我能想到的解决您的问题的一种方法(规模小得多,因为我不想创建100^7个数据)。:)

例如,如果您有四个变量,范围从0到10,并且希望找到它们的所有组合,加起来等于10,那么您可以这样做:

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

df这是我能想到的解决您的问题的一种方法(规模小得多,因为我不想创建100^7个数据)。:)

例如,如果您有四个变量,范围从0到10,并且希望找到它们的所有组合,加起来等于10,那么您可以这样做:

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

df这里是一个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)))
}

sum_to_N这里有一个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)))
}


sum\U to\N当你得到一个大于100的和时,你应该看看如何打破每个for循环…看起来像是
expand。grid
combn
将提供一个更简单的方法…虽然这样的问题对于大的U来说非常困难。这似乎是一个简单的任务,但你要求R创建并计算100^7(100万亿)不同的数字组合,每个组合包含7个数字。这是一项艰巨的任务。我同意@Laurel的建议,当总数超过目标值时,打破循环,这至少会减少任务的规模。你应该看看。根据该包中的
P()
函数,只有大约1.9亿个分区,但是计算它们仍然是一个巨大的挑战。可能会有帮助。当总和超过100时,您应该了解如何打破每个for循环…似乎
扩展。网格
组合将提供一种更简单的方法…尽管这样的问题对于大U来说非常困难。这似乎是一项简单的任务,但您要求R创建并计算100^7(这是100万亿)不同的数字组合,每个组合包含7个数字。这是一项艰巨的任务。我同意@Laurel的建议,即当总和超过目标值时,打破循环,这至少会将任务的规模缩小一点。您应该查看。根据该包中的
P()
函数,有“只是"大约1.9亿个分区,但计算它们仍然是一个巨大的挑战。可能会有帮助。100^7似乎有点高。具体数字可能取决于这些分区是否需要唯一,以及它们是否需要为正。我认为,在开始解决方案之前,您应该询问问题的澄清。您可以简化子集设置位:
df[行和(df)==10,]
这个解决方案的问题是,我无法分配向量,因为在我的例子中,它的大小将是372529 GB。正如我所说,我发布这个是为了展示排列如何与expand.grid一起工作。单是100万亿个总和就成了问题,更不用说在内存中预存储了。对不起,我之前的帖子,首先我非常粗鲁@戈帕拉:谢谢你的回复。我不明白你说的“更不用说预先存储在内存中”是什么意思,提前感谢您提供的所有帮助100^7似乎有点高。具体数字可能取决于这些数字是否需要唯一,以及它们是否需要为正。我认为您应该在跳转到解决方案之前要求澄清问题。您可以简化子集设置:
df[rowsumes(df)==10,]
这个解决方案的问题是,我无法分配向量,因为在我的例子中,它的大小将是372529 GB。正如我所说,我发布这个是为了展示排列如何与expand.grid一起工作。单是100万亿个总和就成了问题,更不用说在内存中预存储了。对不起,我之前的帖子,首先我非常粗鲁@Gopala感谢您的回复。我不明白您所说的“更不用说在内存中预存储”是什么意思,提前感谢您的帮助数据帧需要48 GB(每行28字节)。这不在可能的范围之外,但很难实现。Dave谢谢你的回答,你是对的,我想我必须采取另一种方法。就像你说的,这很难实现,特别是如果以后我要计算到它的距离向量。无论如何,你的解就是答案,因为我刚刚运行了它,效果很好!!谢谢s!!数据帧需要48 GB(每行28字节)。这不在可能的范围之外,但很难实现。Dave谢谢你的回答,你是对的,我想我必须采取另一种方法。就像你说的,这很难实现,特别是如果以后我要计算到它的距离向量。无论如何,你的解就是答案,因为我刚刚运行了它,效果很好!!谢谢s