【问题标题】:select files from a list of files with a pattern从具有模式的文件列表中选择文件
【发布时间】:2017-05-16 11:49:58
【问题描述】:

我有一个文件列表,它是使用 list.files 创建的:

filesxx<-list.files(pattern="0-4000")

获取如下列表:

  [1] "Alta Guajira Coord & elevation TS 0-4000.txt"     "Baja Guajira Coord           & elevation TS 0-4000.txt"    
  [3] "Bajo Meta Coord & elevation TS 0-4000.txt"        "Rio Arauca Coord & elevation TS 0-4000.txt"      
  [5] "Rio Catatubo Coord & elevation TS 0-4000.txt"     "Rio Cesar Coord & elevation TS 0-4000.txt"       
  [7] "Rio Sogamoso Coord & elevation TS 0-4000.txt"     "Rio Tomo Coord & elevation TS 0-4000.txt"        
  [9] "Sabana de Bogota Coord & elevation TS 0-4000.txt" "Total Area Coord & elevation TS 0-4000.txt"  

我想从这个列表中创建一个循环,它将根据循环变量 (a) 选择其中一个文件,这将是名称中的一个模式,例如变量 (a) 将是:“Alta Guajira”并在下一个周期“Rio Tomo”..等

我该如何做到这一点,如何从已制作的文件列表中选择具有模式的文件? 我认为函数Shopt 更多的是排除模式,也许函数find 可以工作,但在寻找一些类似的案例后我还没有找到答案。

【问题讨论】:

  • Alta GuajiraRio Tomo之间的模式在哪里/是什么,看起来并不明显。
  • 您的模式是否总是名称中的连续字符串?如果是这样,请使用grep()
  • 我认为不清楚,所以我编辑了问题,列表是使用 list.files 创建的,从这个列表中我将使用循环,循环变量将是“新模式”并将每个周期都会发生变化,但我不知道如何在已经是 list.files 结果的列表中查找模式。我希望它清楚的问题
  • @Gin_Salmon "Alta Guajira", "Rio Tomo".. 等是向量中的元素,循环变量将在每个周期中选择其中一个文件,但我显示的这个列表是已经是使用具有初始模式的 list.files 的结果:“0-4000”。现在我需要一种方法来从这个列表中过滤出每个周期都会改变的模式

标签: r filenames


【解决方案1】:

您可以使用list.files() 列出工作目录中的文件。它有一个参数允许你指定某种模式:

 list.files(pattern = "Alta Guajira")
 # [1] "Alta Guajira Coord & elevation TS 0-4000.txt"  

如果你有一个带有图案的向量,比如:

patterns <- c("Alta Guajira", "Rio Tomo", "Rio Sogamoso")
sapply(patterns, function(x){list.files(pattern = x)})

编辑

如果您已经有了文件名,那么您基本上是在寻找字符向量中的模式。

df <- c("Alta Guajira Coord & elevation TS 0-4000.txt","Baja Guajira Coord & elevation TS 0-4000.txt", 
        "Bajo Meta Coord & elevation TS 0-4000.txt", "Rio Arauca Coord & elevation TS 0-4000.txt",
        "Rio Catatubo Coord & elevation TS 0-4000.txt", "Rio Cesar Coord & elevation TS 0-4000.txt",
        "Rio Sogamoso Coord & elevation TS 0-4000.txt", "Rio Tomo Coord & elevation TS 0-4000.txt",
        "Sabana de Bogota Coord & elevation TS 0-4000.txt", "Total Area Coord & elevation TS 0-4000.txt")

patterns <- c("Alta Guajira", "Rio Tomo", "Rio Sogamoso")

it  <- 0
res <- c()
for(i in patterns){
    it  <- it + 1
    res <- append(res, df[grepl(pattern = i, x = df)])
}
res
# [1] "Alta Guajira Coord & elevation TS 0-4000.txt" "Rio Tomo Coord & elevation TS 0-4000.txt"    
# [3] "Rio Sogamoso Coord & elevation TS 0-4000.txt"

或者,或者:

res2 <- sapply(patterns, function(y){df[grepl(pattern = y, x = df)]})

【讨论】:

  • 我能够调整您的答案,现在可以正常使用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多