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