【问题标题】:Listing files that match a criteria in R列出与 R 中的条件匹配的文件
【发布时间】:2018-10-01 22:13:16
【问题描述】:

我有一系列文件。每个文件名都有两个数字。第一个数字是代号,可以是 0 - 250 之间的数字。下一个数字是 1 - 450 之间的型号。

一些例子:

Generation_Flux_0_Model_10.txt
Generation_Flux_0_Model_5.txt
Generation_Flux_1_Model_20.txt
Generation_Flux_2_Model_17.txt
Generation_Flux_5_Model_9.txt
Generation_Flux_55_Model_5.txt
Generation_Flux_117_Model_2.txt
Generation_Flux_8_Model_23.txt

我只想列出一组指定代的文件。例如,获取第 1 代和第 8 代的文件应该只列出:

Generation_Flux_1_Model_20.txt 和 Generation_Flux_8_Model_23.txt。

我写了以下行,它只产生一个二进制值。

reactionFile = list.files(pattern = "\\.txt$")
generations = c(0, 1, 8)
str_extract(reactionFile,"\\d+")%in%generations

[1] 真 真 真 假 假 假 真 真

  1. 有没有办法在 list.files(pattern="") 参数?
  2. 还有哪种方法可以更快地选择唯一需要的文件? 列出目录中的所有文件并获取子集或 使用 list.files() 仅加载所需的文件?

【问题讨论】:

  • 对于每个世代号,如果它是单个数字,请使用像 ^Generation_Flux_[81]_Model_\\d+\\.txt$ 这样的字符类。如果像 55110 这样的代数超过一个数字,请使用一个组:^Generation_Flux_(55|110)_Model_\\d+\\.txt$。对于一位和多位数字的通用解决方案,请使用分组。
  • ...但是如果您想要第 1 代到第 50 代,您应该为它构建一个模式:^Generation_Flux_([1-9]|[1-4]\\d|50)_Model_\\d+\\.txt$
  • @revo 在 R 中,我们可以用任何一组数字动态地构建一个交替。
  • @revo 第一个解决方案有效。如果我的要求发生变化,第二个可能会很方便。谢谢。

标签: r regex file-search


【解决方案1】:

试试这个模式:

list.files(pattern = "^Generation_Flux_[18]_Model_\\d+\\.txt$")

这应该只匹配第 1 代和第 8 代,任何型号。

如果您有任意一组代号,那么您可以动态构建一个交替,例如

getGens <- function(v) {
    pat <- paste0("(", paste0(v, collapse="|"), ")")
    return(pat)
}

gens <- c(1, 50, 100, 150)      # or any values you wish to use
pat <- paste0("^Generation_Flux_", getGens(gens), "_Model_\\d+\\.txt$")
list.files(pattern = pat)

【讨论】:

  • 谢谢。它确实适用于个位数。但是,它不适用于一位以上的数字,例如10, 18 因为世代数可以在 0 - 250 之间变化。
  • 我回答了你的例子,即 1 和 8。告诉我实际问题,我可以更新我的答案。
  • 代数在 0 - 250 之间变化。我想列出一组指定代的文件,例如[1, 50, 100, 150], [1, 5, 8] 每次都会改变。
  • @SriniShine 答案更新了一个选项,假设您有一个矢量或可能在某处点击的世代编号列表。
  • 解决方案看起来很简洁。谢谢。
猜你喜欢
  • 2015-10-13
  • 2012-01-21
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2012-05-08
  • 2022-01-12
  • 2022-08-13
相关资源
最近更新 更多