what not hacer equal does como r match

not - % Más rápido en% operador



not in r (2)

El paquete fastmatch implementa una versión de match mucho más rápida para coincidencias repetidas (por ejemplo, en un bucle):

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)

¿Existe una implementación similar para %in% que podría usar para acelerar las búsquedas repetidas?


Mira la definición de %in% :

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

Es fácil escribir su propia función %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


la coincidencia casi siempre se hace mejor poniendo ambos vectores en marcos de datos y fusionándolos (vea varias combinaciones de dplyr)

Por ejemplo, algo como esto le daría toda la información que necesita:

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)

o left_join, right_join, full_join, semi_join, anti_join, dependiendo de qué información es la más útil para usted