【问题标题】:Vector whose elements add up to a value in R向量,其元素相加为 R 中的一个值
【发布时间】:2017-09-03 02:41:54
【问题描述】:

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

任何帮助表示赞赏。

【问题讨论】:

  • 前三个元素随心所欲,那么第四个元素就是前三个元素的总和减去 20。我怀疑您可能没有提到其他一些限制......

标签: r vector random


【解决方案1】:

要分成 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。

【讨论】:

  • 哇,太棒了!我实际上仍在试图理解你所做的一切,但它奏效了。非常感谢!
【解决方案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)
}

【讨论】:

  • OP 没有说整数,但foo(3,20) 返回分数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多