如何使用perl = TRUE正则表达式选择cols .
data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0) %>% dplyr::select(matches("(?i)b(?!a)"))
Run Code Online (Sandbox Code Playgroud)
grep(needle,haystack,...)出错:正则表达式无效'(?i)b(?!a)',原因'无效正则表达式'
正则表达式确实有效.
grep("(?i)b(?!a)",c("baa","boo","boa","lol","bAa"),perl=T)
> [1] 2 3
Run Code Online (Sandbox Code Playgroud)
有快捷功能/方式吗?
matches在dplyr不支持perl = TRUE.但是,您可以自己创建功能.在对源代码进行一些挖掘之后,这可以工作:
快捷方式:
library(dplyr)
#notice the 3 colons because grep_vars is not exported from dplyr
matches2 <- function (match, ignore.case = TRUE, vars = current_vars())
{
dplyr:::grep_vars(match, vars, ignore.case = ignore.case, perl = TRUE)
}
data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0) %>% select(matches2("(?i)b(?!a)"))
#boo boa
#1 0 0
Run Code Online (Sandbox Code Playgroud)
或者更具解释性的解决方案
matches2 <- function (match, ignore.case = TRUE, vars = current_vars())
{
grep_vars2(match, vars, ignore.case = ignore.case)
}
#this is pretty much my only change in the original dplyr:::grep_vars
#to make it accept perl.
grep_vars2 <- function (needle, haystack, ...)
{
grep(needle, haystack, perl = TRUE, ...)
}
data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0) %>%
select(matches2("(?i)b(?!a)"))
#boo boa
#1 0 0
Run Code Online (Sandbox Code Playgroud)