【问题标题】:Replace entire expression that contains a specific string替换包含特定字符串的整个表达式
【发布时间】:2020-08-15 10:49:02
【问题描述】:

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

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_ 之类的字符串的整个表达式替换为“不一致”。我以为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) 将不起作用。

【问题讨论】:

    标签: string r expression gsub


    【解决方案1】:

    这是一种方法

    > 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_" 匹配的字符串

    【讨论】:

    • 哇,太快了,谢谢@GSee。使用gsub 的那个更适合我的目的,因为它允许我使用新表达式创建单独的列。
    【解决方案2】:

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

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2021-05-26
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多