根据正则表达式替换数据框列
发布时间:2020-12-14 05:38:01 所属栏目:百科 来源:网络整理
导读:我试图使用正则表达式提取数据框中的部分列.我遇到的问题包括grep返回整个值的事实,而不仅仅是匹配的部分,并且str_extract似乎不能以矢量化方式工作. 这是我正在尝试的.我想df $match来显示alpha.alpha.模式存在的地方,否则NA.如何只显示匹配的部分? 另外,
我试图使用正则表达式提取数据框中的部分列.我遇到的问题包括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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |