2017-10-16 66 views
1

我有三个变量:X,Y和Z.我想找到X,Y和Z的所有组合,总计为100. X,Y Z只能取[0,100]之间的值。在输出中应该somehtinkg这样的:R:得到三个数字的所有组合,总计为100

X Y Z Sum 
100 0 0 100 
99 1 0 100 
99 0 1 100 
98 2 0 100 
98 1 1 100 
98 0 2 100 

等等...

上任何建议如何得到所有可能的组合?

+0

推荐愚弄:[R - 从两种或多种载体的所有元素的独特组合(https://stackoverflow.com/q/11388359/903061),[如何生成组合矩阵?](https://stackoverflow.com/q/3993546/903061)。生成所有组合,使用'rowSums'和子行数为'== 100'的子集。 – Gregor

+0

我可以找到的最佳方法是将一个数字固定为常数,问题将更容易。例如,当x = 0时,有y和z的101个组合。当x = 1时,有100个y和z的组合。所以如此。 – Arthur

+0

'partitions :: composition(100,3)'; [生成所有排列的N球在M箱](https://stackoverflow.com/questions/27064675/generating-all-permutations-of-n-balls-in-m-bins/27064925#27064925) – Henrik

回答

3

由于您仅限于三列上的1:100,因此这很容易暴力破解。如果范围较大,则需要更聪明的解决方案。

library(data.table) 

df <- expand.grid(X = 0:100, 
        Y = 0:100, 
        Z = 0:100) 

setDT(df) 

df[, Sum := X + Y + Z] 
df[Sum == 100] 
#   X Y Z Sum 
# 1: 100 0 0 100 
# 2: 99 1 0 100 
# 3: 98 2 0 100 
# 4: 97 3 0 100 
# 5: 96 4 0 100 
# ---    
# 5147: 1 1 98 100 
# 5148: 0 2 98 100 
# 5149: 1 0 99 100 
# 5150: 0 1 99 100 
# 5151: 0 0 100 100 
+0

很好的解决方案!过去一周我一直在使用'expand.grid',但我没有想到它! – Arthur

+0

或者更简单的'df [(X + Y + Z)== 100]' –

+1

@RichScriven True,但需要添加Sum列以获取OP中的输出。可以使'df [(X + Y + Z)== 100,。(X,Y,Z,Sum = 100)]'但我不确定这是否比两步更清晰。 –

4

的替代(也许为大量更有效)。将

df <- do.call(rbind, lapply(0:100, function(i) data.frame(x=i, y=0:(100-i)))) 
df$z <- 100-df$x-df$y 
+1

这可能比我的解决方案的规模更好,因为您只生成正确的行,而不是所有组合,然后进行子集化。远高于0:100的方法是使用相当数量的RAM。 –