我的数据框有一个包含大量文件名的列,如:
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.avi
加congruent
。我可以使用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)
将无效。
答案 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"