在R中列出不符合某一模式的文件

33

R 有一个用于列出目录中文件的函数,即 list.files()。它带有可选参数 pattern=,以仅列出与模式匹配的文件。

目录 data 中的文件: File1.csv File2.csv new_File1.csv new_File2.csv

list.files(path="data", pattern="new_")

结果为[1] "new_File1.csv" "new_File2.csv"

但是我如何反转搜索,即仅列出File1.csvFile2.csv

3个回答

40

我相信你必须亲自做,因为list.files不支持Perl正则表达式(所以你不能像这样做pattern=^(?!new_))。

也就是说,列出所有文件,然后用grep进行过滤:

grep(list.files(path="data"), pattern='new_', invert=TRUE, value=TRUE)

grep(...)函数用于模式匹配;invert=TRUE将匹配结果反转;value=TRUE返回匹配结果的值(即文件名),而非匹配结果的索引。


有没有可能用匹配多个模式的方式来实现类似的方法? - Archeologist

10

我认为最简单的方法(如果包括程序员的时间,可能也是最快的方法)是运行 list.files 两次,一次列出所有文件,然后第二次使用不想要的文件模式,然后使用 setdiff 函数查找那些不属于你想要排除的组的文件名。


3
补充@Greg Snow的回答:
library("here")
path <- here("Data", "Folder", "Subfolder")

all_files <- list.files(path, pattern = ".csv")
unwanted <- list.files(path, pattern = "_unwanted.csv")
wanted <- base::setdiff(all_files, unwanted)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接