向量的元素加起来为R中的值

时间:2017-04-07 16:13:35

标签: r vector random

我尝试创建一个元素加起来为特定数字的向量。例如,让我们说我想创建一个包含4个元素的向量,它们必须加起来为20,所以它的元素可以是6,6,4,4或2,5,7,6等等。我尝试使用sample()seq()运行一些行,但我不能这样做。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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)
}