我有三个变量: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
等等...
上任何建议如何得到所有可能的组合?
我有三个变量: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
等等...
上任何建议如何得到所有可能的组合?
由于您仅限于三列上的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
很好的解决方案!过去一周我一直在使用'expand.grid',但我没有想到它! – Arthur
或者更简单的'df [(X + Y + Z)== 100]' –
@RichScriven True,但需要添加Sum列以获取OP中的输出。可以使'df [(X + Y + Z)== 100,。(X,Y,Z,Sum = 100)]'但我不确定这是否比两步更清晰。 –
的替代(也许为大量更有效)。将
df <- do.call(rbind, lapply(0:100, function(i) data.frame(x=i, y=0:(100-i))))
df$z <- 100-df$x-df$y
这可能比我的解决方案的规模更好,因为您只生成正确的行,而不是所有组合,然后进行子集化。远高于0:100的方法是使用相当数量的RAM。 –
推荐愚弄:[R - 从两种或多种载体的所有元素的独特组合(https://stackoverflow.com/q/11388359/903061),[如何生成组合矩阵?](https://stackoverflow.com/q/3993546/903061)。生成所有组合,使用'rowSums'和子行数为'== 100'的子集。 – Gregor
我可以找到的最佳方法是将一个数字固定为常数,问题将更容易。例如,当x = 0时,有y和z的101个组合。当x = 1时,有100个y和z的组合。所以如此。 – Arthur
'partitions :: composition(100,3)'; [生成所有排列的N球在M箱](https://stackoverflow.com/questions/27064675/generating-all-permutations-of-n-balls-in-m-bins/27064925#27064925) – Henrik