2017-04-07 9 views
2

要素が特定の数になるベクトルを作成しようとしています。たとえば、4つの要素からなるベクトルを作成したいとしましょう。要素を6つ、6つ、4つ、または2つ、5つ、7つ、6つなど、20まで追加する必要があります。私はsample()seq()を使っていくつかの行を実行しようとしましたが、できません。要素が値を加算するベクトルR

助けてください。

+4

最初の3つの要素を好きなものにしてから、4番目の要素は最初の3つの要素の合計からわずか20を引いたものになります。私はあなたが言及していないかもしれないいくつかの他の制約を疑う... – Spacedman

答えて

2

4つの部分に分割するには、20個の数字の間に可能な19個の区切りから3つの区切り点が必要です。次に、パーティションは0、パーティション、および20の間の間隔のサイズに過ぎません。

> sort(sample(19,3)) 
[1] 5 7 12 
> diff(c(0, 5,7,12,20)) 
[1] 5 2 5 8 

テストでは、大きなマトリックスを作成できます。各列はインスタンスです。

> trials = sapply(1:1000, function(X){diff(c(0,sort(sample(19,3)),20))}) 
> trials[,1:6] 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 1 8 13 3 2 
[2,] 4 7 10 2 9 5 
[3,] 2 11 1 4 3 7 
[4,] 11 1 1 1 5 6 

これらはすべて20に追加されますか?

> all(apply(trials,2,sum)==20) 
[1] TRUE 

奇妙なケースはありますか?

> range(trials) 
[1] 1 17 

いいえ、ゼロで​​はなく、17より大きい値はありません。これは(1,1,1,17)ケースになります。あなたはゼロなしで18を持つことはできません。

+0

うわー、それは素晴らしいです!私は実際にあなたがしたことすべてを理解しようとしていますが、うまくいきました。どうもありがとうございます! – Lfppfs

2
foo = function(n, sum1){ 
    #Divide sum1 into 'n' parts 
    x = rep(sum1/n, n) 

    #For each x, sample a value from 1 to that value minus one 
    f = sapply(x, function(a) sample(1:(a-1), 1)) 

    #Add and subtract f from 'x' so that sum(x) does not change 
    x = x + sample(f) 
    x = x - sample(f) 

    x = floor(x) 
    x[n] = x[n] - (sum(x) - sum1) 

    return(x) 
} 
+0

OPは整数を言っていませんでしたが、 'foo(3,20)'は分数を返します。 – Spacedman

+0

@Spacedman、私は今それを固定したと思う。 –

+0

それも機能する、ありがとう。 – Lfppfs

関連する問題