2017-10-16 8 views
1

X、Y、Zの3つの変数がある.100になるX、Y、Zの組み合わせをすべて探したい。X、Y Zは[0,100]の間の値しかとりません。 ouputをこのようsomehtinkgになります。R:3つの数字のすべての組み合わせを得る。

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

推奨dupesあろう:[R - 二つ以上のベクターからすべての要素の固有の組み合わせ(https://stackoverflow.com/q/11388359/903061)、[組み合わせの行列を生成する方法](https://stackoverflow.com/q/3993546/903061)を参照してください。すべての組み合わせを生成し、 'rowSums'を使用し、行の合計が' == 100'の部分集合を使用します。 – Gregor

+0

私が見つけることができる最善の方法は、ある数値を定数として修正することです。問題はもっと簡単になります。たとえば、x = 0の場合、yとzの101の組み合わせがあります。 x = 1のとき、yとzの100の組み合わせがあります。そうである。 – Arthur

+0

'partitions :: composition(100、3)'; [M個のボールのN個のボールのすべての順列を生成する](https://stackoverflow.com/questions/27064675/generating-all-permutations-of-n-balls-in-m-bins/27064925#27064925) – Henrik

答えて

3

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'で過去1週間働いていましたが、私はそれを考えませんでした! – Arthur

+0

またはもっと簡単に 'df [(X + Y + Z)== 100]' –

+1

@RichScriven Trueですが、OPの出力を得るためにSumカラムを追加する必要があります。それは '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

これは、すべての組み合わせではなく正しい行を生成してからサブセット化するので、私のソリューションよりも優れている可能性があります。私の方法ではかなりの量のRAMを使用しています。 –

関連する問題