如何模拟向量仅包含0、1、2,且向量的给定总和

时间:2019-07-18 05:52:22

标签: r

我将模拟一个R中包含100个元素的向量。该向量仅包含数字值0、1或2。我只知道向量的总和。例如,如果向量的总和为30,则0的总数可以为77,1的总数可以为16,2的总数可以为7。如何在R中基于向量的总和?

2 个答案:

答案 0 :(得分:2)

这是解决此问题的一种非常简单的尝试。它没有采样所有100个元素,而是利用了至少必须有100 - target个零的事实。我认为,也许还有一种方法可以利用这样一个事实,即最多有100 - (target / 2)个零(如果所有非零元素都是2)。

sim_freq = function(target, total_size = 100, max_attempts = 100) {

   min_zeros = total_size - target 

   target_found = FALSE 
   attempts = 0
   while (! target_found) {
       alleles = sample(0:2, size = target, replace = TRUE)
       target_found = sum(alleles) == target
       attempts = attempts + 1

       if (attempts > max_attempts) {
           stop("Couldn't find a match")
       }
   }

   print(paste0("Found a match in ", attempts, " attempts."))
   # Shuffle the generated alleles and zeros together
   sample(c(alleles, rep(0, min_zeros)))
}

用法:

sim_freq(26)
sim_freq(77)

在我针对26和77的目标进行的测试中,通常会找到一个向量,该向量在<20次尝试中具有所需的总和,但是对于不同的目标可能会有很大的不同。

答案 1 :(得分:0)

这里有一些代码可以完成,我用15个元素来完成,以便更快地计算出来:

x <- 0:2 #values you desire in the vector
y <- 10  #desired sum of the vector
b <- 0  #inizialize b
#until the sum of the elements is equal to the desired sum
while (b != y) {
  a = sample(x,15,replace = TRUE) #calculate a random vector of 15 elements
  b = sum(a) #sum of the elements
}
a #desired vector