r - 如何获得两个向量之间匹配的元素比例?
问题描述
我有两个大向量,例如:
set.seed(17)
vec1 <- paste0(sample(1:10, 10000000, replace = T), "_", sample(1:1000000000, 10000000))
vec2 <- paste0(sample(1:10, 1000000, replace = T), "_", sample(1:1000000000, 1000000))
我需要确定 vec2 中的元素在 vec1 中的比例。我目前正在使用:
system.time({
prop <- table(vec2 %in% vec1)[[2]]/length(vec2)
})
但是,我应用它的实际向量非常大(最多约 2,000,000,000 个元素),因此性能非常重要。有人能建议我如何减少运行时间吗?
解决方案
以下是一些时间选项,也使用@Sotos 和@Henrik 的评论建议进行比较。
library(microbenchmark)
library(data.table)
microbenchmark(a1 = table(vec2 %in% vec1)[[2]]/length(vec2) ,
a2 = sum(vec2 %in% vec1)/length(vec2),
a3 = sum(!is.na(match(vec2, vec1)))/length(vec2),
a4 = length(intersect(vec2, vec1)) / length(vec2),
a5 = sum(vec2 %chin% vec1)/length(vec2))
#Unit: milliseconds
# expr min lq mean median uq max neval
# a1 1269.84 1340.468 1667.251 1410.252 2191.750 2535.723 100
# a2 1022.26 1086.938 1284.692 1124.565 1152.516 2286.028 100
# a3 1023.59 1125.517 1387.592 1148.337 1852.645 3849.555 100
# a4 1022.84 1088.056 1291.582 1122.846 1173.768 2277.901 100
# a5 449.19 453.146 462.781 454.365 458.178 620.996 100
显然,Henrik 的解决方案是最快的。
数据
set.seed(17)
vec1 <- paste0(sample(1:10, 10000000, replace = T), "_",
sample(1:1000000000, 10000000))
vec2 <- paste0(sample(1:10, 1000000, replace = T), "_",
sample(1:1000000000, 1000000))
推荐阅读
- javascript - Reactjs 动态更新 Body 的背景图片
- c++ - Visual Studio 2019 - 为文件类型设置默认扩展名
- python - 如何在版本控制中维护使用 venv 制作的 Python 项目
- discord.net - Discord.net 找出某人是否有角色
- python - 导出时如何使用pandas数据框na_rep和float_format?
- python-3.x - 通过 PPA 更新 Python3 后 Linux Mint 更新管理器不起作用
- reactjs - 如何从 react-create-app 创建一个捆绑文件
- python - 使用列表作为索引的 Pythonic 方式(没有 numpy)
- ios - 更新整个 pList 数组 - 快速
- node.js - 从一个数据库解析读取并写入事务中的另一个数据库