2016-08-09 31 views
0

该命令用于将数据子集filelist删除所有“jpg”文件。使用grepl()匹配数据R上的多个图案

filetype.isnotjpg <- setdiff(filelist, subset(filelist, grepl("\\.jpg$", filelist))) 

所以这需要字符串“filelist”,其中包含来自目录的文件名称。我想要返回所有不是“jpg”,“doc”,“pdf”,“xls”等类型的文件。我希望能够指定多个类型,因为我想筛选列表。

理想像

target.files <- setdiff(filelist, subset(filelist, grepl( 
    c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), filelist) 

这个递归算法工程做我想做的:

a <- setdiff(files.list, subset(files.list, grepl("\\.tmp", files.list, ignore.case = TRUE))) 

a <- setdiff(a, subset(a, grepl("\\.jpg", a, ignore.case = TRUE))) 
a <- setdiff(a, subset(a, grepl("\\.pdf", a, ignore.case = TRUE))) 
a <- setdiff(a, subset(a, grepl("\\.tif", a, ignore.case = TRUE))) 

等喜欢的东西应用。()可能会奏效?我是新来的R抱歉。

的42个作品的解决方案:

 target.files <- setdiff(
     files.list, 
     subset(files.list, 
       grepl( 
       paste(
        c("\\.jpg", "\\.doc", "\\.pdf", 
        "\\.xls", "\\.tif", "\\.docx", "\\.xlsx", "\\.jpeg"), 
        collapse="|") , 
       files.list, 
       ignore.case = TRUE))) 
+0

可重复的例子 –

+0

你有一些我固定的'grepl'拼写错误。 –

回答

1

您可以使用file_exttools从文件名中提取扩展名。然后,你可以看到,如果他们在你的列表,并使用标准的矢量子集:

filelist[!(tools::file_ext(filelist) %in% c("jpg","jpeg","doc","pdf","xls"))] 

如果您需要忽略的情况下,可以环绕列表或扩展程序tolower

2

我会尝试用paste()的崩溃分离-ing “|”这是或操作者的正则表达式:

target.files <- setdiff(filelist, subset(filelist, grepl(paste(
c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), collapse="|") , filelist) 

你知道的list.files功能也接受一个模式参数,因此您可以用像这样做在一个单一的步骤:

my_files <- list.files(path="/path/to/dir/", 
         pattern=paste(c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), 
             collapse="|")) 
+0

这个工作,我现在可以生成字符串。 file.list来自sql数据库,所以list.files()不会是一个选项。 – jrzelling