我试图使用正则表达式提取数据框中的部分列.我遇到的问题包括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