我需要创建一个数据框,其中包含七个变量总和为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之后需要永远...
答案 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。这可能是太多行以适应数据框,因此您应该尝试找到一个不涉及存储所有组合的问题的方法。