Как получить пропорцию элементов, которые совпадают между двумя векторами? - PullRequest
1 голос
/ 02 мая 2019

У меня есть два больших вектора, например:

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 элементов), поэтому производительность очень важна. Кто-нибудь может подсказать, как можно уменьшить время выполнения?

1 Ответ

0 голосов
/ 02 мая 2019

Вот некоторые варианты с таймингами, также использующие предложения @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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...