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

Gee*_*cid 2 string expression r gsub

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

d <- c("harry11_scott80_norm.avi","harry11_norm.avi","harry11_scott80_lpf.avi", 
       "joel51_lpf.avi","rich82_joel51_lpf.avi")
Run Code Online (Sandbox Code Playgroud)

我想R键有两个人的名字,如更换所有表情harry11_scott80_norm.avi与表达incongruent和所有单人的名字像那些harry11_norm.avicongruent.我可以gsub用来做到这一点:

dd <- gsub("harry11_scott80_norm.avi", "incongruent", d) 
Run Code Online (Sandbox Code Playgroud)

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

dd <- gsub("_scott80_", "incongruent", d)
Run Code Online (Sandbox Code Playgroud)

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

在R中有一个问题,如何用另一个字符串替换包含某个模式的字符串?,但我不确定如何agrep在这种情况下使用 .


编辑:副奖金问题 - 基于@GSee答案,是否有任何功能允许您传递要替换的字符串列表?例如,gsub(c(".*_scott80_.*", ".*_harry11_.*"), "incongruent", d)不起作用.

GSe*_*See 6

这是一种方式

> gsub(".*_scott80_.*", "incongruent", d)
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"
Run Code Online (Sandbox Code Playgroud)

或者 grep

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

为了解决您的编辑问题,我相信这样做(用|"或"代表)

gsub(".*(_scott80_|_harry11_).*", "incongruent", d)
Run Code Online (Sandbox Code Playgroud)

当然,你在d那场比赛中没有任何字符串"_harry11_"


AGS*_*AGS 5

如果您的文件名都是相同的格式,即具有两个名称的文件名即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"
Run Code Online (Sandbox Code Playgroud)