【问题标题】:vector pattern matching and vector replacement in list of files names in RR中文件名列表中的矢量模式匹配和矢量替换
【发布时间】:2018-11-23 06:35:05
【问题描述】:

我在一个文件夹中有 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 的新手。

【问题讨论】:

    标签: r vector replace pattern-matching gsub


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。我尝试应用您的代码,但收到以下错误消息:file_name %like% paste0("_", i) 中的错误:找不到函数 "%like%"
      • 这不是很“r”-ic。 file.rename() 是矢量化的。无需将其包装在循环中。只需使用旧名称的字符向量作为from 参数和新名称的字符向量作为to 参数来执行它。
      【解决方案3】:

      一个选项是使用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"
      

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        相关资源
        最近更新 更多