首页 > 解决方案 > 有效地找到集合差异并生成随机样本

问题描述

我有一个非常大的数据集,其中包含分类标签和一个包含数据集中所有可能标签a的向量:b

a <- c(1,1,3,2)   # artificial data
b <- c(1,2,3,4)   # fixed categories

现在我想在a所有剩余类别的集合中找到每个观察值(即b排除给定观察值的元素a)。从剩下的这些类别中,我想随机抽取一个。

我使用循环的方法是

goal <- numeric() # container for results

for(i in 1:4){

d       <- setdiff(b, a[i]) # find the categories except the one observed in the data
goal[i] <- sample(d,1)      # sample one of the remaining categories randomly

}

goal
[1] 4 4 1 1

但是,这必须进行很多次并应用于非常大的数据集。有没有人有更有效的版本来达到预期的结果?

编辑:

不幸的是,akrun 的函数比原始循环慢。如果有人有一个具有竞争力的创意想法,我很高兴听到它!

标签: rsetsampleset-difference

解决方案


我们可以用vapply

vapply(a,  function(x) sample(setdiff(b, x), 1), numeric(1))

set.seed(24)
a <- sample(c(1:4), 10000, replace=TRUE)
b <- 1:4
system.time(vapply(a,  function(x) sample(setdiff(b, x), 1), numeric(1)))
#   user  system elapsed 
#  0.208   0.007   0.215 

推荐阅读