我試圖創建一個向量,其元素合計爲特定數字。例如,假設我想創建一個包含4個元素的矢量,並且它們必須加起來爲20,所以它的元素可以是6,6,4,4或2,5,7,6等等。我嘗試使用sample()
和seq()
來運行一些行,但我無法做到。其元素合計爲R中的值的矢量
任何幫助表示讚賞。
我試圖創建一個向量,其元素合計爲特定數字。例如,假設我想創建一個包含4個元素的矢量,並且它們必須加起來爲20,所以它的元素可以是6,6,4,4或2,5,7,6等等。我嘗試使用sample()
和seq()
來運行一些行,但我無法做到。其元素合計爲R中的值的矢量
任何幫助表示讚賞。
要分成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。
哇,太棒了!實際上我仍然在試着理解你所做的一切,但它工作。非常感謝! – 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個元素,然後第四個元素只是20減去前三個元素的總和。我懷疑你可能沒有提到一些其他的限制... – Spacedman