Подтвердить что ты не робот

Быстрее% в% оператора

Пакет fastmatch реализует гораздо более быструю версию match для повторных совпадений (например, в цикле):

set.seed(1)
library(fastmatch)
table <- 1L:100000L
x <- sample(table, 10000, replace=TRUE)
system.time(for(i in 1:100) a <-  match(x, table))
system.time(for(i in 1:100) b <- fmatch(x, table))
identical(a, b)

Есть ли аналогичная реализация для %in%, которую я мог бы использовать для ускорения повторных поисков?

4b9b3361

Ответ 1

Посмотрите на определение %in%:

R> `%in%`
function (x, table) 
match(x, table, nomatch = 0L) > 0L
<bytecode: 0x1fab7a8>
<environment: namespace:base>

Легко написать собственную функцию %fin%:

`%fin%` <- function(x, table) {
  stopifnot(require(fastmatch))
  fmatch(x, table, nomatch = 0L) > 0L
}
system.time(for(i in 1:100) a <- x %in% table)
#    user  system elapsed 
#   1.780   0.000   1.782 
system.time(for(i in 1:100) b <- x %fin% table)
#    user  system elapsed 
#   0.052   0.000   0.054
identical(a, b)
# [1] TRUE

Ответ 2

совпадение почти всегда лучше делается путем размещения обоих векторов в кадрах данных и слияния (см. различные объединения из dplyr)

Например, что-то вроде этого даст вам всю необходимую информацию:

library(dplyr)

data = data_frame(data.ID = 1L:100000L,
                  data.extra = 1:2)

sample = 
  data %>% 
  sample_n(10000, replace=TRUE) %>%
  mutate(sample.ID = 1:n(),
         sample.extra = 3:4 )

# join table not strictly necessary in this case
# but necessary in many-to-many matches
data__sample = inner_join(data, sample)

#check whether a data.ID made it into sample
data__sample %>% filter(data.ID == 1)

или left_join, right_join, full_join, semi_join, anti_join, в зависимости от того, какая информация вам больше всего подходит