微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用R在文件夹中移动多个文件名的月份数字?

如何解决如何使用R在文件夹中移动多个文件名的月份数字?

我有一个文件夹,其中包含从 1950 年 1 月到 2018 年 12 月的多个光栅 .tif 文件。但是,它们首先以月份命名,然后以年份命名(见下文):

[1] "./WI_only_cmi60_01_1950.tif" "./WI_only_cmi60_01_1951.tif" "./WI_only_cmi60_01_1952.tif"

[4] "./WI_only_cmi60_01_1953.tif" "./WI_only_cmi60_01_1954.tif" "./WI_only_cmi60_01_1955.tif"

[7] "./WI_only_cmi60_01_1956.tif" "./WI_only_cmi60_01_1957.tif" "./WI_only_cmi60_01_1958.tif"

...


[820] "./WI_only_cmi60_12_2010.tif" "./WI_only_cmi60_12_2011.tif" "./WI_only_cmi60_12_2012.tif"

[823] "./WI_only_cmi60_12_2013.tif" "./WI_only_cmi60_12_2014.tif" "./WI_only_cmi60_12_2015.tif"

[826] "./WI_only_cmi60_12_2016.tif" "./WI_only_cmi60_12_2017.tif" "./WI_only_cmi60_12_2018.tif"

当我将这些带入 R 并使用 Raster 包来堆叠这些时:

# list tif files in working directory
tifs <- list.files(pattern = ".tif$",full.names = TRUE)

# stack tifs in working directory
rstack <- stack(tifs)

当我每年和每个月需要它们时,它们首先与所有 1 月 .tif 文件一起排序,然后是所有 2 月 .tif 文件等(按时间顺序从 1950 年 1 月到 2018 年 12 月)。

有没有办法重命名这些文件,其中文件名的顺序可以重新排列,以便每个文件名的第 15 和 16 字符移动到年份字符(18、19、20、21)之后?

即列出的第一个文件名将从

"./WI_only_cmi60_01_1950.tif"

"./WI_only_cmi60_1950_01.tif"

解决方法

我们可以作为一个组捕获并重新排列反向引用

sub("(\\d+)_(\\d+)(\\.tif)","\\2_\\1\\3","./WI_only_cmi60_01_1950.tif")

-输出

[1] "./WI_only_cmi60_1950_01.tif"
,

我不会重命名文件,而是适当地对文件名进行排序。从长远来看,这应该是一种更好的可重复性和更新方法。

示例(未排序)

ff <- c("./WI_only_cmi60_01_1950.tif","./WI_only_cmi60_01_1951.tif","./WI_only_cmi60_01_1952.tif","./WI_only_cmi60_06_1950.tif","./WI_only_cmi60_06_1951.tif","./WI_only_cmi60_06_1952.tif","./WI_only_cmi60_12_1950.tif","./WI_only_cmi60_12_1951.tif","./WI_only_cmi60_12_1952.tif")

使用阿克伦的表达

i <- sub("(\\d+)_(\\d+)(\\.tif)",ff)
fs <- ff[order(i)]
fs
#[1] "./WI_only_cmi60_01_1950.tif" "./WI_only_cmi60_06_1950.tif"
#[3] "./WI_only_cmi60_12_1950.tif" "./WI_only_cmi60_01_1951.tif"
#[5] "./WI_only_cmi60_06_1951.tif" "./WI_only_cmi60_12_1951.tif"
#[7] "./WI_only_cmi60_01_1952.tif" "./WI_only_cmi60_06_1952.tif"
#[9] "./WI_only_cmi60_12_1952.tif"

实现相同目标的更基本方法

x <- gsub("WI_only_cmi60_","",basename(ff))
d <- paste(substr(x,4,7),substr(x,1,2),sep="-")
i <- order(d)
ff[i]

鉴于该模式似乎相当简单(69 年,每个 12 个月),您也可以(使用您的所有文件)

i <- rep(1:69,12)
fs <- ff[i]

(总是仔细检查结果!)

,

使用 strsplit

x <- "./WI_only_cmi60_01_1950.tif"
revfun <- function(x) {
  r <- rev(el(strsplit(x,'')))
  Reduce(paste0,rev(r[c(1:4,10:12,5:9,13:length(r))]))
}
revfun(x)
# [1] "./WI_only_cmi60_1950_01.tif"
,

我使用的代码如下 - 通过 akrun 和 Robert Hijmans 给出的答案 - 但我想澄清我如何使用这些答案来读取工作目录中的所有 .tif 文件并堆叠这些:

setwd("C:/...")

# list tif files in working directory
ff <- list.files(pattern = ".tif$",full.names = TRUE) 
i <- sub("(\\d+)_(\\d+)(\\.tif)",ff) 
fs <- ff[order(i)] 

library(raster)

# create stack of tif files
rstack <- stack(fs)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?