R中按月和小时的订单列表

时间:2015-11-12 03:03:04

标签: r

我有一个我想要读入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')

3 个答案:

答案 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允许这些