R 如何使用list.files以正确的月度顺序导入数据

R 如何使用list.files以正确的月度顺序导入数据,r,import,R,Import,我有100年的月度数据,其中每个月都是一个文件,文件名以数据的年份和月份结尾 e、 g.cru_ts_3_10.1901.2009.pet_1901_1.asc是1901年1月1日的文件 问题是当我列出我的文件时,文件的顺序会发生变化,第10、11和12个月在1之后: files <- list.files(pattern=".asc") head(files) [1] "cru_ts_3_10.1901.2009.pet_1901_1.asc" "cru_ts_3_10.1901.

我有100年的月度数据,其中每个月都是一个文件,文件名以数据的年份和月份结尾

e、 g.cru_ts_3_10.1901.2009.pet_1901_1.asc是1901年1月1日的文件

问题是当我列出我的文件时,文件的顺序会发生变化,第10、11和12个月在1之后:

files <- list.files(pattern=".asc") 
head(files)

[1] "cru_ts_3_10.1901.2009.pet_1901_1.asc"  "cru_ts_3_10.1901.2009.pet_1901_10.asc" "cru_ts_3_10.1901.2009.pet_1901_11.asc"
[4] "cru_ts_3_10.1901.2009.pet_1901_12.asc" "cru_ts_3_10.1901.2009.pet_1901_2.asc"  "cru_ts_3_10.1901.2009.pet_1901_3.asc" 
我知道为什么会发生这种情况,但我如何才能以正确的月度顺序导入数据

files <- c("cru_ts_3_10.1901.2009.pet_1901_1.asc", 
           "cru_ts_3_10.1901.2009.pet_1901_10.asc", 
           "cru_ts_3_10.1901.2009.pet_1901_11.asc", 
           "cru_ts_3_10.1901.2009.pet_1901_12.asc", 
           "cru_ts_3_10.1901.2009.pet_1901_2.asc", 
           "cru_ts_3_10.1901.2009.pet_1901_3.asc",
           "cru_ts_3_10.1901.2009.pet_1902_1.asc",
           "cru_ts_3_10.1901.2009.pet_1902_10.asc", 
           "cru_ts_3_10.1901.2009.pet_1902_11.asc")
返回:

[1] "cru_ts_3_10.1901.2009.pet_1901_1.asc" 
[2] "cru_ts_3_10.1901.2009.pet_1901_2.asc" 
[3] "cru_ts_3_10.1901.2009.pet_1901_3.asc" 
[4] "cru_ts_3_10.1901.2009.pet_1901_10.asc"
[5] "cru_ts_3_10.1901.2009.pet_1901_11.asc"
[6] "cru_ts_3_10.1901.2009.pet_1901_12.asc"
[7] "cru_ts_3_10.1901.2009.pet_1902_1.asc" 
[8] "cru_ts_3_10.1901.2009.pet_1902_10.asc"
[9] "cru_ts_3_10.1901.2009.pet_1902_11.asc"
返回:

[1] "cru_ts_3_10.1901.2009.pet_1901_1.asc" 
[2] "cru_ts_3_10.1901.2009.pet_1901_2.asc" 
[3] "cru_ts_3_10.1901.2009.pet_1901_3.asc" 
[4] "cru_ts_3_10.1901.2009.pet_1901_10.asc"
[5] "cru_ts_3_10.1901.2009.pet_1901_11.asc"
[6] "cru_ts_3_10.1901.2009.pet_1901_12.asc"
[7] "cru_ts_3_10.1901.2009.pet_1902_1.asc" 
[8] "cru_ts_3_10.1901.2009.pet_1902_10.asc"
[9] "cru_ts_3_10.1901.2009.pet_1902_11.asc"
查看gtools包中的mixedsort函数

查看gtools包中的mixedsort函数

另一个基于正则表达式的解决方案。它的工作原理是从文件名中提取年和月来构造一个真实的日期,然后使用排序顺序打印文件列表

pat <- "^.*pet_([0-9]{1,})_([0-9]{1,}).asc$"
ord_files <- as.Date(gsub(pat, sprintf("%s-%s-01", "\\1", "\\2"), files))
files[order(ord_files)]
解释

我们使用正则表达式来匹配文件名中的年和月。因此,\\1匹配年份,\\2匹配月份。我们仍然需要将其转换为日期。语句sprintf%s-%s-01、\1、\2用年和月的值代替%s。将字符串转换为日期需要as.Date。

另一个基于正则表达式的解决方案。它的工作原理是从文件名中提取年和月来构造一个真实的日期,然后使用排序顺序打印文件列表

pat <- "^.*pet_([0-9]{1,})_([0-9]{1,}).asc$"
ord_files <- as.Date(gsub(pat, sprintf("%s-%s-01", "\\1", "\\2"), files))
files[order(ord_files)]
解释


我们使用正则表达式来匹配文件名中的年和月。因此,\\1匹配年份,\\2匹配月份。我们仍然需要将其转换为日期。语句sprintf%s-%s-01、\1、\2用年和月的值代替%s。将字符串转换为日期需要as.Date。

谢谢,这解决了月份的问题,但也造成了年份的问题,现在我把所有的一月加在一起,一月份是100年,二月份是100年……>1.asc[2]cru(2)cru(2)cru(2)cru(2)cru(2)cru(3)cru(3)cru(3)cru(10.1901.1.2009.2009.2009.pet(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(3)cru(10.1901.1901.1901.1.2009.2009.2009.2009.1.2009.2009.2009.2009.2009.pet.pet.pet(2)pet(2)pet(2)pet(2)pet(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(1)cru)cru(获取错误:错误:在:+as.numericpastex[lengthx-1],m,sep=+}我从终端复制并粘贴了已经执行的内容。您必须先删除>和+,然后才能将其粘贴到您的中。我把它清理干净了,所以你应该可以复制粘贴谢谢这也行+1因为我只能接受1个答案谢谢,这解决了月份的问题,但造成了年份的问题,现在我把所有的一月加在一起100年的一月,然后100个二月….>1.asc[2]cru(2)cru(2)cru(2)cru(2)cru(2)cru(3)cru(3)cru(3)cru(10.1901.1.2009.2009.2009.pet(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(3)cru(10.1901.1901.1901.1.2009.2009.2009.2009.1.2009.2009.2009.2009.2009.pet.pet.pet(2)pet(2)pet(2)pet(2)pet(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(2)cru(1)cru)cru(获取错误:错误:在:+as.numericpastex[lengthx-1],m,sep=+}我从终端复制并粘贴了已经执行的内容。您必须先删除>和+,然后才能将其粘贴到您的中。我把它清理干净了,所以你应该可以复制粘贴谢谢这也行+1因为我只能接受1个答案出于好奇,为什么你需要按正确的顺序导入数据?这对我来说似乎很不寻常-在我能想到的所有情况下,一旦导入记录,就可以更轻松地对其进行排序…@MattParker如果数据文件很大,也许你一次只想加载几个文件,但你更愿意抓取一月和二月,而不是一月和十月。出于好奇,为什么需要按正确的顺序导入数据?这对我来说似乎很不寻常-在我能想到的所有情况下,在导入记录后对其进行排序会更容易…@MattParker如果数据文件很大,也许您一次只想加载几个文件,但是你更喜欢一月和二月而不是一月和十月。你能解释一下sprintf%s-%s-01,\\1,\\2是如何工作的吗?你能解释一下sprintf%s-%s-01,\\1,\\2是如何工作的吗?