在R中的两个字符串之间子集一个文件列表

tct7dpnv  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个类似模式的文件列表如下:

filenames <- c("MERRA2_200.tavg1_2d_lnd_Nx.19950120.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950121.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950122.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950123.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950124.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950125.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950126.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950127.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950128.SUB.nc",
               "MERRA2_200.tavg1_2d_lnd_Nx.19950129.SUB.nc")

我想提取两个日期之间的每个文件(由“Nx”后面的数字指定。
例如,我想要1995年1月20日至1995年1月23日的子集。我想要1995年1月22日至1995年1月25日的另一个子集,以此类推。我将对这些“迷你数据集”中的每一个进行单独分析。
我试过使用“stringr”包,但没有成功。我得到的最接近的是使用str_subset(x, "[a-u]")表达式(除了用文件名代替“a”和“u”),但没有运气。

krcsximq

krcsximq1#

您可以执行以下操作,即:

  • 定义要提取的日期范围
  • 从文件名中获取日期信息
  • 根据您的范围定义的日期进行筛选
library(tidyverse)
date_start <- as.Date('01-20-1995', format = '%m-%d-%Y')

date_end <- as.Date('01-23-1995', format = '%m-%d-%Y')

match_dates <- seq(date_start, date_end, by = 'day')

filenames_subset <- as.data.frame(filenames) %>%
  mutate(date = str_match(filenames, 'Nx.(.*?).SUB')[,2],
         date = as.Date(date, format = '%Y%m%d')) %>%
  filter(date %in% !!match_dates) %>%
  pull(filenames)

[1] "MERRA2_200.tavg1_2d_lnd_Nx.19950120.SUB.nc"
[2] "MERRA2_200.tavg1_2d_lnd_Nx.19950121.SUB.nc"
[3] "MERRA2_200.tavg1_2d_lnd_Nx.19950122.SUB.nc"
[4] "MERRA2_200.tavg1_2d_lnd_Nx.19950123.SUB.nc"

或者,您可以执行以下操作,得到相同的结果:

date_start <- as.Date('19950120', format = '%Y%m%d')

date_end <- as.Date('19950123', format = '%Y%m%d')

match_dates <- format(seq(date_start, date_end, by = 'day'), '%Y%m%d')

stringr::str_subset(filenames, paste0(match_dates, collapse = '|'))

相关问题