LyzandeRs에 대한 수정/보조 노트는 dplyr
어휘를 사용하지 않는 버전으로 magrittr
파이프 만 사용합니다. 따라서 랩퍼 함수 작성 및 인수 지정 등은 생략 할 수 있습니다.
이것은 dplyr
보다 약간 자세한 정보입니다. 그러나 base
보다 간략하며 grep
또는 stringi::stri_detect
등과 같은 기능의 모든 유연성을 사용할 수 있습니다.
매우 빠릅니다. 벤치 마크를 확인하십시오. 물론, 더 큰 예제를 위해 속도를 점검해야한다는 점에 유의해야합니다. dplyr의 오버 헤드는이 작은 예제에서 꽤 큽니다. 따라서 공정한 속도 비교는 유스 케이스에 달려 있습니다.
df <- data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0)
library(magrittr)
df %>%
.[,grep("(?i)b(?!a)", names(.), perl = T)]
# boo boa
# 1 0 0
#in the following a copy of LyzanderRs approaches
library(dplyr)
matches2 <- function (match, ignore.case = TRUE, vars = current_vars()) {
dplyr:::grep_vars(match, vars, ignore.case = ignore.case, perl = TRUE)
}
grep_vars2 <- function (needle, haystack, ...) {
grep(needle, haystack, perl = TRUE, ...)
}
matches3 <- function (match, ignore.case = TRUE, vars = current_vars()) {
grep_vars2(match, vars, ignore.case = ignore.case)
}
library(microbenchmark)
microbenchmark(
df %>% select(matches2("(?i)b(?!a)")),
df %>% select(matches3("(?i)b(?!a)")),
df %>% .[,grep("(?i)b(?!a)", names(.), perl = T)]
)
# Unit: microseconds
# expr min lq mean median uq max neval
# df %>% select(matches2("(?i)b(?!a)")) 3994.867 4309.877 4570.6414 4555.8065 4726.9310 6618.769 100
# df %>% select(matches3("(?i)b(?!a)")) 3981.841 4177.834 4792.2025 4396.3275 4655.6780 31812.876 100
# df %>% .[, grep("(?i)b(?!a)", names(.), perl = T)] 183.164 210.797 242.1678 237.2455 263.6935 554.624 100
유효한 정규 표현식을 어떻게 보는지 알 수 없습니다. '(? i)'에서,'? '는 아무 것도 지정하지 않아도되는 선택적 한정자입니다. 그 앞에 뭔가가 있어야합니다. – Rahul
@ Rahul 유효합니다. '(? i)'는'i' 수정자를 인라인으로 추가합니다. – ctwheels
@ raahul https://regex101.com/에서 regEx에 대해 배울 수 있습니다. 그 매우 시원한 사이트. –