我想在R中有一个函数,如果它们尚不存在,则在给定的子字符串(例如“alpha”)周围插入点(“。”)。例如。
string="10-alpha-epoxy-Amorph-4-ene"
应该返回
"10-.alpha.-epoxy-Amorph-4-ene"
string="alpha-cadolene"
应该返回
".alpha.-cadolene"
但
string=".alpha.-cadolene"
应该返回
".alpha.-cadolene"
(子串可能多次出现)
使用R中的gsub实现此目的的最简单方法是什么?
欢呼,汤姆答案 0 :(得分:5)
我会做这样的事情:
gsub("[.]?(alpha)[.]?", ".\\1.", c("10-alpha-epoxy-Amorph-4-ene",
".alpha.-cadolene", "alpha.-cadolene",
".alpha-cadolene"
))
[1] "10-.alpha.-epoxy-Amorph-4-ene" ".alpha.-cadolene"
".alpha.-cadolene" ".alpha.-cadolene"
编辑对许多字词的概括:
如果您有术语列表,可以使用paste
使用create tour正则表达式:
terms <- c('alpha','gamma','beta','delta')
gsub(paste0("[.]?(",paste0(terms,collapse='|'),")[.]?"), ".\\1.",
c("10-alpha-epoxy-Amorph-4-ene",
".gamma.-cadolene", "beta.-cadolene",
".delta-cadolene"))
[1] "10-.alpha.-epoxy-Amorph-4-ene" ".gamma.-cadolene"
".beta.-cadolene"
[4] ".delta.-cadolene"
编辑以完整字母获取格雷尔列表:
library(XML)
dat <- readHTMLTable("http://en.wikipedia.org/wiki/Greek_alphabet",
strinsAsFactors=FALSE)[[2]]
terms <- as.character(dat$V2[-c(1,2)])
[1] "alpha" "beta" "gamma" "delta" "epsilon" "zeta" "eta" "theta" "iota" "kappa" "lambda"
[12] "mu" "Name" "Modern" "nu" "xi" "omicron" "pi" "rho" "sigma" "tau" "upsilon"
[23] "phi" "chi" "psi" "omega"
答案 1 :(得分:1)
这是一种方式:
R> gsub("-(alpha)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")
[1] "10-.alpha.-epoxy-Amorph-4-ene"
R> gsub("-(alpha)-", ".-\\1-.", "10-alpha-epoxy-Amorph-4-ene")
[1] "10.-alpha-.epoxy-Amorph-4-ene"
R>
保留(....)
表达式,以便在替换部分中将其作为\\1
(其中第二个此类表达式为\\2
)进行调用。
但明确命名表达式,您确保不会发生其他匹配。你当然可以概括一下:
gsub("-([a-z]*)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")
将替换任何小写字母的表达式(但不是标点符号,数字......)。