加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:37:42 所属栏目:大数据 来源:网络整理
导读:如何使用perl = TRUE选择cols,如正则表达式. data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0) %% dplyr::select(matches("(?i)b(?!a)")) Error in grep(needle,haystack,…) : invalid regular expression ‘(?i)b(?!a)’,reason ‘Invalid regexp’ 正则表达式
如何使用perl = TRUE选择cols,如正则表达式.

data.frame(baa=0,boo=0,boa=0,lol=0,bAa=0) %>% dplyr::select(matches("(?i)b(?!a)"))

Error in grep(needle,haystack,…) : invalid regular expression
‘(?i)b(?!a)’,reason ‘Invalid regexp’

正则表达式确实有效.

grep("(?i)b(?!a)",c("baa","boo","boa","lol","bAa"),perl=T)

> [1] 2 3

有快捷功能/方式吗?

解决方法

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,bAa=0) %>% select(matches2("(?i)b(?!a)"))
#boo boa
#1   0   0

或者更具解释性的解决方案

matches2 <- function (match,vars = current_vars()) 
{
  grep_vars2(match,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,...) 
{
  grep(needle,perl = TRUE,...)
}

 data.frame(baa=0,bAa=0) %>% 
   select(matches2("(?i)b(?!a)"))
 #boo boa
 #1   0   0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读