我尝试创建一个元素加起来为特定数字的向量。例如,让我们说我想创建一个包含4个元素的向量,它们必须加起来为20,所以它的元素可以是6,6,4,4或2,5,7,6等等。我尝试使用sample()
和seq()
运行一些行,但我不能这样做。
任何帮助表示感谢。
答案 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)
}