2015-10-04 10 views
21

Pakiet fastmatch implementuje wiele szybsza wersja match dla powtarzanych zestawienia (np w pętli):Szybsze% w operatora%

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) 

Czy istnieje podobna realizacja dla %in% mogę użyć do przyspieszenia powtarzające wyszukiwań ?

Odpowiedz

27

Spójrz na definicji %in%:

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

Łatwo jest napisać własny %fin% funkcję:

`%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 
+0

ale fastmatch to nie działa, jeśli pasuje przeciwko NA, czy baza mecz. – skan

+0

Gdzie to jest ?. Czy "https://github.com/s-u/fastmatch" jest właściwym linkiem ?. Wygląda na to, że nie jest aktualizowany od dawna. – skan

+0

Próbowałem% fin% i fmatch z lapply pasować do każdej kolumny big data.frame lub data.table i nie można zauważyć dużej różnicy w prędkości. – skan

3

mecz jest prawie zawsze lepiej zrobić umieszczając oba wektory w dataframes i scalanie (patrz różne połączenia z dplyr)

Na przykład coś takiego dałoby wszystkie potrzebne informacje:

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) 

lub left_join, right_join, full_join, semi_join, anti_join, w zależności od informacji najbardziej przydatna

+0

Czy mógłbyś wytłumaczyć to (najlepiej z dołączonym przykładem)? W tej chwili "odpowiedź" jest raczej komentarzem niż prawdziwą odpowiedzią. – Jaap

+0

Zobacz wersję edytowaną – bramtayl