在R中查找并替换整个值

tom*_*tom 1 regex replace r

我正在寻找一种方法来使用R中的find和replace函数来替换字符串的整个值,而不仅仅是字符串的匹配部分.我有一个包含很多(非常)长名称的数据集,我正在寻找一种有效的方法来查找和更改它们的值.

所以,例如,我试图改变整个字符串

string <- "Generally.speaking..do.you.prefer.to.try.out.new.experiences.like.trying.things.and.meeting.new.people..or.do.you.prefer.familiar.situations.and.faces."
Run Code Online (Sandbox Code Playgroud)

"exp"
Run Code Online (Sandbox Code Playgroud)

用这个代码

string <- gsub("experiences", "exp", string)
Run Code Online (Sandbox Code Playgroud)

但是,这会导致将"exp"替换为仅匹配"experience"的字符串部分,并使长名称的其余部分保持原样(为清晰起见加粗):

"Generally.speaking..do.you.prefer.to.try.out.new.EXP ..like.trying.things.and.meeting.new.people..or.do.you.prefer.familiar.situations. and.faces".

在这种情况下,因为字符串包含"经验",所以应该用"exp"替换.

有没有办法告诉gsub或其他一些函数来替换整个值?我看了很多教程,看起来函数只能在一个字符串或整个值中运行,但不是在两者之间运行.

Fra*_*ank 5

gsub由于您知道所需的值("exp"),因此无需修改字符串.

s = c(string,"bah","egad.experiences")

replace(s,grep("experiences",s),"exp")
# [1] "exp" "bah" "exp"
Run Code Online (Sandbox Code Playgroud)

速度.这比其他@Frank的答案中的字符串修改快一点.

(感谢@rawr指出我们应该打开perl解析.)

ss <- c(replicate(1e6,s))
system.time(replace(ss,grep("experiences",ss,perl=TRUE),"exp"))
#    user  system elapsed 
#     0.6     0.0     0.6 
system.time(gsub(".*experiences.*", "exp", ss,perl=TRUE))
#    user  system elapsed 
#    2.39    0.00    2.38
Run Code Online (Sandbox Code Playgroud)

在每个答案中取消替换操作,看起来匹配的不同模式构成了大部分差异(与我在上一次编辑中看到的预期相反):

system.time(grep("experiences",ss,perl=TRUE))     # used in my answer
#    user  system elapsed 
#    0.64    0.00    0.64
system.time(grep(".*experiences.*",ss,perl=TRUE)) # used in purple-gravatar @Frank's answer
#    user  system elapsed 
#    1.82    0.00    1.82 
Run Code Online (Sandbox Code Playgroud)

  • 我不是弗兰克,但是如果你在`system.time(gsub(".*experience.*","exp",ss))`中使用`perl = TRUE`,它对我来说将快两倍至少 (2认同)