2015-10-04 6 views
21

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% के लिए एक समान कार्यान्वयन मैं दोहराया लुकअप तेजी लाने के लिए इस्तेमाल कर सकते हैं है ? %in% की परिभाषा को

उत्तर

27

देखो:

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

लिए सबसे उपयोगी है, लेकिन fastmatch अगर आप एनए के खिलाफ मेल खाते हैं यह काम नहीं करता, आधार मैच करता है पर निर्भर करता है। – skan

+0

यह कहां है? क्या उचित लिंक "https://github.com/s-u/fastmatch" है? ऐसा लगता है कि बहुत समय पहले अपडेट नहीं किया जा रहा है। – skan

+0

मैं% fin% की कोशिश कर रहा हूं और बड़े डेटा के प्रत्येक कॉलम पर मिलान करने के लिए लापरवाही से fmatch.frame या डेटा.table और गति में बहुत अंतर नहीं देख सकता। – skan

3

मैच लगभग हमेशा बेहतर dataframes में दोनों वैक्टर डालने और विलय द्वारा किया जाता है (देखें 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, क्या जानकारी आप

+0

क्या आप इसे समझाएंगे (अधिमानतः एक उदाहरण के साथ)? इस समय आपका "उत्तर" वास्तविक उत्तर से अधिक टिप्पणी है। – Jaap

+0

संपादित संस्करण देखें – bramtayl

संबंधित मुद्दे