5

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

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)

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

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


编辑:附带奖金问题-基于@GSee的回答,是否有任何功能可以让您传递要替换的字符串列表?例如,gsub(c(".*_scott80_.*", ".*_harry11_.*"), "incongruent", d)不会工作。

4

2 回答 2

16

这是一种方法

> 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_"

于 2012-11-07T18:14:20.437 回答
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"
于 2012-11-07T21:30:42.513 回答