使用向量长度作为某种权重,从不同长度的多个向量进行无替换采样

  • 本文关键字:向量 替换 采样 权重 r
  • 更新时间 :
  • 英文 :


我想使用向量长度作为某种权重,从不同长度的多个向量中随机采样,这样与较小的向量相比,从较大大小的向量中提取更多的样本(按比例采样(。

为了说明我的观点,请考虑以下内容:

# 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]

最新更新