我正在寻找一种方法来使用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或其他一些函数来替换整个值?我看了很多教程,看起来函数只能在一个字符串或整个值中运行,但不是在两者之间运行.
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)
| 归档时间: |
|
| 查看次数: |
3900 次 |
| 最近记录: |