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

时间:2018-06-13 15:42:55

标签: r vector replace pattern-matching gsub

我有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的新人。

3 个答案:

答案 0 :(得分:1)

这里的关键是您不会将此视为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)

答案 1 :(得分:0)

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

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”更改为文件目录并在运行上述代码之前进行备份,因为它是盲目编写的。

答案 2 :(得分:0)

选项是将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"