要素が特定の数になるベクトルを作成しようとしています。たとえば、4つの要素からなるベクトルを作成したいとしましょう。要素を6つ、6つ、4つ、または2つ、5つ、7つ、6つなど、20まで追加する必要があります。私はsample()
とseq()
を使っていくつかの行を実行しようとしましたが、できません。要素が値を加算するベクトルR
助けてください。
要素が特定の数になるベクトルを作成しようとしています。たとえば、4つの要素からなるベクトルを作成したいとしましょう。要素を6つ、6つ、4つ、または2つ、5つ、7つ、6つなど、20まで追加する必要があります。私はsample()
とseq()
を使っていくつかの行を実行しようとしましたが、できません。要素が値を加算するベクトルR
助けてください。
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を持つことはできません。
うわー、それは素晴らしいです!私は実際にあなたがしたことすべてを理解しようとしていますが、うまくいきました。どうもありがとうございます! – Lfppfs
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)
}
最初の3つの要素を好きなものにしてから、4番目の要素は最初の3つの要素の合計からわずか20を引いたものになります。私はあなたが言及していないかもしれないいくつかの他の制約を疑う... – Spacedman