替换包含特定字符串的整个表达式

时间:2012-11-07 18:12:09

标签: string r expression gsub

我的数据框有一个包含大量文件名的列,如:

d <- c("harry11_scott80_norm.avi","harry11_norm.avi","harry11_scott80_lpf.avi", 
       "joel51_lpf.avi","rich82_joel51_lpf.avi")

我希望R用两个人名称替换所有表达式,例如harry11_scott80_norm.avi表达式incongruent,所有单词名称如harry11_norm.avicongruent。我可以使用gsub来做到这一点:

dd <- gsub("harry11_scott80_norm.avi", "incongruent", d) 

但我得到了很多这些名字,所以这将是一个非常笨重的解决方案。理想情况下,我想将包含_scott80_等字符串的ENTIRE表达式替换为“incongruent”。我认为gsub可以做到这一点,但是当我运行它时:

dd <- gsub("_scott80_", "incongruent", d)

它返回harry11incongruentnorm.avi,这显然是因为它只是替换了确切的字符串匹配。我有一些方法告诉gsub完全替换包含所选字符串的表达式,但我找不到它。

有一个问题In R, how do I replace a string that contains a certain pattern with another string?,但我不确定如何在此上下文中使用agrep


编辑:边奖励问题 - 基于@GSee答案,是否有任何功能可以让您传递要替换的字符串列表?例如,gsub(c(".*_scott80_.*", ".*_harry11_.*"), "incongruent", d)将无效。

2 个答案:

答案 0 :(得分:5)

这是一种方式

> gsub(".*_scott80_.*", "incongruent", d)
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

grep

> d[grep("_scott80_", d)] <- "incongruent"
> d
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

为了解决您的编辑问题,我相信这样做(使用|表示“或”)

gsub(".*(_scott80_|_harry11_).*", "incongruent", d)

当然,d中没有符合"_harry11_"

的字符串

答案 1 :(得分:2)

如果你的文件名都是相同的格式,那就是有两个名字的那些,即harry11_scott80_norm.avi 总是有两个下划线,那些有一个名字,即harry11_norm.avi 总是有一个下划线,你可以快速使用这样的东西重命名你的文件:

d = gsub(".*_.*_.*", "incongruent", d)
> d
[1] "incongruent"      "harry11_norm.avi" "incongruent"      "joel51_lpf.avi"  
[5] "incongruent"

d =gsub(".*_.*","congruent",d)
> d
[1] "incongruent" "congruent"   "incongruent" "congruent"   "incongruent"