我有三個變量: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