2016-08-09 49 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