我想使用向量长度作为某种权重,从不同长度的多个向量中随机采样,这样与较小的向量相比,从较大大小的向量中提取更多的样本(按比例采样(。
为了说明我的观点,请考虑以下内容:
# Generating 100 different individuals
vec1 <- rep( letters , length.out = 100 )
vec2 <- c(1:100)
# Join two above vectors
students <- paste( vec1 , vec2 , sep="" )
以上产生了一个由100名学生组成的庞大矢量。现在我正在尝试生成10个随机向量,从中必须进行最终采样。
# Creating 10 vectors of different sizes
a <- split( students , sample(10, 100 , repl = TRUE) )
vec1 <- a$`1`
vec2 <- a$`2`
vec3 <- a$`3`
vec4 <- a$`4`
vec5 <- a$`5`
vec6 <- a$`6`
vec7 <- a$`7`
vec8 <- a$`8`
vec9 <- a$`9`
vec10 <- a$`10`
现在我有10个不同大小的向量(vec1…vec10(。我的目标是从所有向量中获得总共50个随机样本的最终向量,这样当采样完成时,它将是wrt向量长度,即比例采样。
这样的事情可能发生吗?
如果之前有人问过这个问题,我深表歉意!
这将为您带来大约50名学生(取决于a
的分配方式(
new = unlist(lapply(a, function(x) sample(x, round(length(x)/2))))
要每次精确获得50,您可以执行此
ll = sapply(a, length) # Get length of each vector in "a"
target = 50
new_ll = 0
while (sum(new_ll) != target)
new_ll = round(ll * target / sum(ll) + runif(length(ll), -0.5, 0.5))
new = unlist(lapply(1:length(a), function(i) sample(a[[i]], new_ll[i])))
说明:获取a
中每个向量的长度并分配给ll
。这相当于做ll[1] = length(vec1); ll[2] = length(vec2)
等等。我们需要从a
中的每个向量中采样一定的量,这样我们就得到了50个元素(target
(。该数量由new_ll
确定。它大约等于每个向量长度的target / num_students
倍。
由于这不能保证每次都选择target
的学生,因此我们在runif
中添加一点抖动,以稍微移动数字,并继续循环,直到new_ll
的和等于target
。
最后一行从1到10(或a
中的矢量数量(迭代i
,并从每个矢量a[[i]]
采样new_ll[i]
。