2017-10-16 72 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。 –

相關問題