微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据正则表达式替换数据框列

我试图使用正则表达式提取数据框中的部分列.我遇到的问题包括grep返回整个值的事实,而不仅仅是匹配的部分,并且str_extract似乎不能以矢量化方式工作.

这是我正在尝试的.我想df $match来显示alpha.alpha.模式存在的地方,否则NA.如何只显示匹配的部分?

另外,我如何在R正则表达式中替换[a-zA-Z]?我可以使用像[:alpha:]这样的字符类或POSIX代码吗?

v1 <- c(1:4)
v2 <- c("_a.b._",NA,"_C.D._","_ef_")
df <- data.frame(v1,v2,stringsAsFactors = FALSE)

df$match <- grepl("[a-zA-Z]\\.[a-zA-Z]\\.",df$v2)
df$match

#TRUE FALSE  TRUE FALSE

v2grep <- grep("[a-zA-Z]\\.[a-zA-Z]\\.",df$v2,value = TRUE)

df$match[df$match == TRUE] <- v2grep
df$match[df$match == FALSE] <- NA

df

#v1  v2      match
#1   _a.b._  _a.b._
#2   <NA>    <NA>
#3   _C.D._  _C.D._
#4   _ef_    <NA>

我想要的是:

#v1  v2      match
#1   _a.b._  a.b.
#2   <NA>    <NA>
#3   _C.D._  C.D.
#4   _ef_    <NA>

解决方法

4方法……

这里有2个基本方法,以及我维护的qdapRegex包和stringi包中的rm_default(extract = TRUE).

unlist(sapply(regmatches(df[["v2"]],gregexpr("[a-zA-Z]\\.[a-zA-Z]\\.",df[["v2"]])),function(x){
        ifelse(identical(character(0),x),x)
    })
)

## [1] "a.b." NA     "C.D." NA 

pat <- "(.*?)([a-zA-Z]\\.[a-zA-Z]\\.)(.*?)$"
df[["v2"]][!grepl(pat,df[["v2"]])] <- NA
df[["v2"]] <- gsub(pat,"\\2",df[["v2"]])

## [1] "a.b." NA     "C.D." NA

library(qdapRegex)
unlist(rm_default(df[["v2"]],pattern = "[a-zA-Z]\\.[a-zA-Z]\\.",extract = TRUE))

## [1] "a.b." NA     "C.D." NA 

library(stringi)
stri_extract_first_regex(df[["v2"]],"[a-zA-Z]\\.[a-zA-Z]\\.")

## [1] "a.b." NA     "C.D." NA

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐