我正在寻找一种方法来使用R中的查找和替换函数来替换字符串的整个值,而不仅仅是字符串的匹配部分。我有一个包含很多(非常)长名称的数据集,我正在寻找一种有效的方法来查找和更改它们的值。
所以,例如,我试图改变整个字符串
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."
到
"exp"
使用此代码
string <- gsub("experiences", "exp", string)
但是,这会导致替换&#34; exp&#34;只有匹配&#34;体验&#34;的字符串部分,并且它保留了长名称的其余部分(为了清晰起见,加粗):
&#34; 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&#34;
在这种情况下,由于字符串包含&#34;体验&#34;,因此应将其替换为&#34; exp。&#34;
有没有办法告诉gsub或其他一些函数来替换整个值?我看了很多教程,看起来函数只能在字符串或整个值中运行,但不能在两者之间运行。
答案 0 :(得分:5)
由于您知道所需的值(“exp”),因此无需使用gsub
修改字符串。
s = c(string,"bah","egad.experiences")
replace(s,grep("experiences",s),"exp")
# [1] "exp" "bah" "exp"
速度。这比其他@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
在每个答案中删除替换操作,看起来匹配的不同模式构成了大部分差异(与我在上一次编辑中看到的情况相反):
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
答案 1 :(得分:4)
您可以按如下方式使用gsub
:
gsub(".*experiences.*", "exp", string, perl=TRUE)
# As @rawr notes, set perl=TRUE for improved efficiency
此正则表达式匹配具有0次或更多次字符的字符串(即.*
),然后是&#34;体验&#34;,后跟任何字符0次或更多次。
在这种情况下,你仍然用&#34; exp&#34;替换整场比赛。但是通过使用正则表达式,您可以扩展匹配的定义(从&#34;体验&#34;到#34;。*体验。*&#34;)以实现所需的替换。
答案 2 :(得分:1)
gsub()
用于将特定字符串替换为另一个字符串。在上面的代码中,如果执行以下操作,则整个字符串将更改为exp
result <- gsub(string, "exp", string)
但是,如果您使用grep()
和replace()
,您将获得所需的结果。
res1 <- grep("pattern",string)
为您提供包含该模式的所有行,并在replace()
中使用它。
res_new <- replace(string,res1,"exp")
答案 3 :(得分:0)
您还可以简单地使用gsub()
并在这样的模式之前和之后添加.*
:
string<-"TransRights"
gsub(".*sR.*","HumanRights",string)
结果将是
HumanRights