r - 有效地找到集合差异并生成随机样本
问题描述
我有一个非常大的数据集,其中包含分类标签和一个包含数据集中所有可能标签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 的函数比原始循环慢。如果有人有一个具有竞争力的创意想法,我很高兴听到它!
解决方案
我们可以用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
推荐阅读
- node.js - 运行“npm start”时的 Saleor-Storefront 错误
- python - 如何使用 Python 查找字典中所有键的所有子项
- android - Android 音频播放器不像 WhatsApp 音频播放器那样播放
- sql - 如何为社交网站实现点赞和分享功能?
- javascript - 检查 api 令牌是否存在于 javascript 的标头中
- android - 如何在点击时使editText错误?(科特林)
- swift - Swift - 为包含人脸的照片添加狂欢节面具
- r - 填充 R data.frame 中每一行中的缺失元素
- asp.net-mvc - asp .net mvc 显示函数
- jenkins - java.lang.NoSuchMethodError:在步骤中找不到这样的 DSL 方法“代理”