在dplyr select中使用perl = TRUE正则表达式

And*_*ico 6 regex r dplyr

如何使用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)

有快捷功能/方式吗?

Lyz*_*deR 8

matchesdplyr不支持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)