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