我有一个我想要读入R的文件名列表。目前,文件名按字母顺序排列在字符向量中,因此当我使用向量读取文件时,它们按字母顺序排列在列表中订购。我想要的是根据月份和小时排列字符向量(它们以非常见的格式包含在文件名中,并且数据文件本身没有日期/时间变量)。我的矢量看起来像
chr [1:288] "tair_apr_01.txt" "tair_apr_02.txt" ... "tair_oct_24.txt"
也就是说,每个月的每个小时都有一个元素(数据是每天平均的,所以我的向量中有288个元素。)
有没有办法重新排序我的矢量,以便按月列出?即。
chr [1:288] "tair_jan_01.txt" ... "tair_dec_24.txt"
我知道如何在有数字值时进行排序/排序,并且我已经看到了按日期排序的方法,只要它是以某种格式排序。没有我知道的命令可以应用于这种情况,所以也许我真正想要的是一种有效的方法来手动排序288元素。这是一个较小的完整示例:
我拥有的是
filelist <- c('tair_apr_12.txt', 'tair_dec_24.txt', 'tair_jan_01.txt')
我想要的是
filelist <- c('tair_jan_01.txt', 'tair_apr_12.txt', 'tair_dec_24.txt')
答案 0 :(得分:2)
您可以转换为日期然后订购。请注意,我使用的是数天而不是数小时,因为您的小时数为24小时,%H
十进制格式应为00-23而不是00-24或01-24等。
filelist <- c('tair_apr_12.txt', 'tair_dec_24.txt', 'tair_jan_01.txt')
gsub('.*_([a-z]+)_(\\d{2}).*', '\\1\\2', filelist)
# [1] "apr12" "dec24" "jan01"
o <- order(strptime(gsub('.*_([a-z]+)_(\\d{2}).*', '\\1\\2', filelist), '%b%d'))
filelist[o]
# [1] "tair_jan_01.txt" "tair_apr_12.txt" "tair_dec_24.txt"
答案 1 :(得分:1)
这是一个dplyr回答
library(dplyr)
library(tidyr)
library(magrittr)
data_frame(file = filelist) %>%
separate(file, c("tair",
"month",
"day",
"extension"),
remove = FALSE) %>%
mutate(date =
month %>%
paste(day) %>%
strptime("%b %d") %>%
as.POSIXct) %>%
arrange(date) %>%
use_series(file)
答案 2 :(得分:1)
使用@ rawr的filelist
:
filelist[order(strptime(paste0("01_",filelist), "%d_tair_%b_%H"))]
#[1] "tair_jan_01.txt" "tair_apr_12.txt" "tair_dec_24.txt"
所有这一切都是将每月的第一天"01"
分配给每个时间戳的开头,然后使用它来确保可以生成完整的日期格式。
根据%H
,您可以安全地使用01-24
查找00-23
小时的顺序,而不是?strptime
,
'%H'小时数十进制数(00-23)。作为特殊的异常字符串 例如'24:00:00'被接受输入,因为ISO 8601允许这些