【问题标题】:How to select files in a directory according to specific string in filename?如何根据文件名中的特定字符串选择目录中的文件?
【发布时间】:2015-10-22 08:50:00
【问题描述】:

我正在将目录中的一些 netcdf 文件读入 R。netcdf 文件是根据数据的某些特定特征命名的。

这是一个例子:

aa <- c("dayavg_fcst_surf125.011_tmp.1962010100_1962123121.nc",
        "dayavg_fcst_surf125.011_tmp.1972010100_1972123121.nc",
        "dayavg_fcst_surf125.011_tmp.1982010100_1982123121.nc",
        "dayavg_fcst_surf125.011_tmp.1992010100_1992123121.nc",
        "dayavg_fcst_surf125.011_tmp.2002010100_2002123121.nc",
        "dayavg_fcst_surf125.011_tmp.2010010100_2010123121.nc",
        "dayavg_fcst_surf125.011_tmp.2012010100_2012123121.nc",
        "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc",
        "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc",
        "dayavg_fcst_surf125.011_tmp.2015020100_2015022821.nc")

这些是使用 list.files 函数收集的。

我想选择(保留)这些文件名的子集(作为字符串),特别是引用 2010 年和 2014 年收集的数据的文件。

年份在“.tmp”字符串后面的文件名中表示。例如,第一个条目是 1962 年,以此类推。

为此,我尝试了以下方法:

iyears <- c(2010,2014)
ll <- list()
for (i in 1:length(iyears)){
  ll[[i]] <- aa[grepl(iyears[i],aa)]
}
ll <- c(ll[[1]],ll[[2]])

返回:

> ll
 [1] "dayavg_fcst_surf125.011_tmp.1962010100_1962123121.nc" "dayavg_fcst_surf125.011_tmp.1972010100_1972123121.nc"
 [3] "dayavg_fcst_surf125.011_tmp.1982010100_1982123121.nc" "dayavg_fcst_surf125.011_tmp.1992010100_1992123121.nc"
 [5] "dayavg_fcst_surf125.011_tmp.2002010100_2002123121.nc" "dayavg_fcst_surf125.011_tmp.2010010100_2010123121.nc"
 [7] "dayavg_fcst_surf125.011_tmp.2012010100_2012123121.nc" "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc"
 [9] "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc" "dayavg_fcst_surf125.011_tmp.2015020100_2015022821.nc"
[11] "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc" "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc"

而答案应该是:

> ll
[1] "dayavg_fcst_surf125.011_tmp.2010010100_2010123121.nc" "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc"
[3] "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc"

问题是文件名中的日期字符串如下:

yyyymmddhh

所以,2010也出现在

"dayavg_fcst_surf125.011_tmp.1982010100_1982123121.nc",

由于 198[2 01 0]1.

任何人都可以提出一种获得所需结果的方法吗?

【问题讨论】:

  • 你为什么不直接使用里面的“tmp”呢?喜欢:grep("tmp.2010|tmp.2014", aa, value = TRUE)

标签: r


【解决方案1】:

由于tmp. 部分似乎是文件名中的常规功能,解决此问题的一种非常直接的方法是将其用作搜索字符串的一部分:

> grep("tmp.2010|tmp.2014", aa, value = TRUE)
[1] "dayavg_fcst_surf125.011_tmp.2010010100_2010123121.nc"
[2] "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc"
[3] "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc"

【讨论】:

  • 所以,要使用循环,我可以使用 grep(paste("tmp",".",iyears[i], sep = ''), aa, value = TRUE)。请注意,这只是我的代码的一个小例子,我实际上想在 1900 年到 2014 年期间这样做。
  • @EmmaTebbs,你也可以做更多有趣的正则表达式......而且循环应该是不必要的。您可以使用paste 来获取您要查找的| 分隔值。
【解决方案2】:

主要技巧是指定实际年份在字符串中的位置。以下应该有效:

iyears <- c(2010,2014)
ll <- list()

for (i in 1:length(iyears)){
  ll[[i]] <- aa[grepl(paste0("^dayavg_fcst_surf125\\.011_tmp\\.",iyears[i]),aa)] 
}

ll <- c(ll[[1]],ll[[2]])

# [1] "dayavg_fcst_surf125.011_tmp.2010010100_2010123121.nc"
# [2] "dayavg_fcst_surf125.011_tmp.2014020100_2014022821.nc"
# [3] "dayavg_fcst_surf125.011_tmp.2014120100_2014123121.nc"

【讨论】:

    【解决方案3】:

    为什么不在list.files 中使用pattern 参数:

    list.files(path = ".", pattern = NULL, all.files = FALSE, full.names = FALSE,递归 = FALSE, ignore.case = FALSE,include.dirs = FALSE,no.. = FALSE)

    pattern:可选的正则表达式。只有匹配的文件名 将返回正则表达式。

    参考:R 帮助

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2012-12-14
      • 2020-11-01
      • 2015-04-04
      相关资源
      最近更新 更多