2017-04-07 70 views
2

我試圖創建一個向量,其元素合計爲特定數字。例如,假設我想創建一個包含4個元素的矢量,並且它們必須加起來爲20,所以它的元素可以是6,6,4,4或2,5,7,6等等。我嘗試使用sample()seq()來運行一些行,但我無法做到。其元素合計爲R中的值的矢量

任何幫助表示讚賞。

+4

無論你喜歡什麼,做出前3個元素,然後第四個元素只是20減去前三個元素的總和。我懷疑你可能沒有提到一些其他的限制... – Spacedman

回答

2

要分成4個部分,您需要20個數字之間的19個可能中斷點中的三個中斷點。那麼你的分區只是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