2010-05-13 42 views
1

我有一個文件列表,我試圖提取所有layer1 _ *。grd文件。有一種方法可以在一個grep表達式中執行此操作嗎?試圖刪除文件列表

lof <- c("layer1_1.grd", "layer1_1.gri", "layer1_2.grd", "layer1_2.gri", 
"layer1_3.grd", "layer1_3.gri", "layer1_4.grd", "layer1_4.gri", 
"layer1_5.grd", "layer1_5.gri", "layer2_1.grd", "layer2_1.gri", 
"layer2_2.grd", "layer2_2.gri", "layer2_3.grd", "layer2_3.gri", 
"layer2_4.grd", "layer2_4.gri", "layer2_5.grd", "layer2_5.gri", 
"layer3_1.grd", "layer3_1.gri", "layer3_2.grd", "layer3_2.gri", 
"layer3_3.grd", "layer3_3.gri", "layer3_4.grd", "layer3_4.gri", 
"layer3_5.grd", "layer3_5.gri", "layer4_1.grd", "layer4_1.gri", 
"layer4_2.grd", "layer4_2.gri", "layer4_3.grd", "layer4_3.gri", 
"layer4_4.grd", "layer4_4.gri", "layer4_5.grd", "layer4_5.gri") 

我試圖分兩步做這個:

list.of.files <- list.files(pattern = c("1_")) 
list.of.files <- list.of.files[grep(".grd", list.of.files)] 

有人能賜教如何在一個步驟使用grep做到這一點?我天真地嘗試將list()和c()傳遞給grep,但是,正如你可以想象的那樣,它不起作用。

list.of.files <- list.files() 
list.of.files <- list.of.files[grep(list("1_", ".grd"), list.of.files)] 

回答

3

這應該爲你工作:

> lof[grep("layer1_.*.grd", lof)] 
[1] "layer1_1.grd" "layer1_2.grd" "layer1_3.grd" "layer1_4.grd" "layer1_5.grd" 

而且,我只想澄清你的術語:文件列表是不是一個真正的list;這是一個character載體。

+1

要獲得匹配的值,可以使用'grep(「layer1 _。*。grd」,lof,value = TRUE)''。 – Marek 2010-05-13 18:54:07

+0

我想''layer1 _。* \\。grd「'因爲單點意味着」匹配一個字符「,所以''。*。」'和'「。+」'給出了相同的結果。檢查'grep(「layer1 _。*。grd」,「layer1_xgrd」)'。 – Marek 2010-05-13 19:04:58

2

stringr替代方案是lof[str_detect(lof, "layer1_.*.grd")]

事實上,在這種情況下,您可以對丟失的字符進行更具體的說明,因此"layer1_[[:digit:]].grd"將作爲此處的模式使用,如果lof很長,則可能會更快。

+0

謝謝大家的精彩投入。 – 2010-05-14 05:24:01