R中文件名列表中的矢量模式匹配和矢量替换

vector pattern matching and vector replacement in list of files names in R

我在一个文件夹中有 60 个“.tif”文件。它们的命名如下:a_1, a_2, a_3,...,a_30 b_1, b_2, b_3,...,b_30 等等

我想按日期更改数值。 例如,a_1和b_1将分别重命名为a_2010-01-01和b_2010-01-01,而a_2和b_2将被重命名为a_2010-01-02和b_2010-01-02等

我创建了两个向量:

file_name<-list.files("/path/", pattern="tif", recursive=F)
d<-seq(1, 100, 1)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')

我尝试使用函数 gsub 但我不太明白如何使用它:

 gsub(d, day, file_name)

我是 R 的新手

可以通过多种方式完成,这里是一个易于理解的方式:

library(data.table)
file_name<-list.files("/path/", pattern="tif", recursive=F)
day <- seq(from=as.Date("2010-01-01"), to= as.Date("2010-01-30"), by='day')

for(i in 1:30){
  oldFiles = file_name[file_name %like% paste0("_",i)]
  cat("Handling", oldFiles, "\n")
  newFiles = gsub(paste0("_", i), paste0("_", as.character(day[i])), oldFiles)
  file.rename(from = file.path("/path", oldFiles),to = file.path("/path", newFiles))
}

请确保您已将“/path”更改为文件目录,并在运行上述代码之前进行备份,因为它是盲写的。

一个选项是使用 strsplitsapply 作为:

# Represents sample files from directory
v <- c('a_1', 'a_2', 'a_3','a_30', 'b_1', 'b_2', 'b_3','b_30')

sapply(strsplit(v, split = "_"), function(x){
  sprintf("%s_%s-%02d",x[1],"2010-01", as.numeric(x[2]))
})

#[1] "a_2010-01-01" "a_2010-01-02" "a_2010-01-03" "a_2010-01-30" "b_2010-01-01"
#      "b_2010-01-02" "b_2010-01-03" "b_2010-01-30"

这里的关键是您没有将其作为 gsub 问题来处理。你在正确的轨道上,因为我认为你不想使用 gsub。您已经创建了一个日期向量,现在您只需在其前面添加 "a_""b"file.rename() 是您要用来重命名文件的名称。在重命名文件的同时尝试模式匹配比它的价值更痛苦。只需创建矢量并重命名:

old_names <- list.files(pattern="tif", recursive=F)
days <- seq(from = as.Date("2010-01-01"), to = as.Date("2010-01-30"), by = "day")
new_names <- paste(paste(rep(c("a", "b"), each = 30), days, sep = "_"), "tif", sep = ".")
file.rename(from = old_names, to = new_names)