按月份和小时排列的订单列表(R)

按月份和小时排列的订单列表(R),r,R,我有一个要读入R的文件名列表。目前,文件名是按字母顺序排列的字符向量,因此当我使用向量读入文件时,它们按字母顺序排列在列表中。我想要的是根据月份和小时来排列字符向量(它们以一种不常见的格式包含在文件名中,并且数据文件本身没有日期/时间变量)。我的向量看起来像 chr [1:288] "tair_apr_01.txt" "tair_apr_02.txt" ... "tair_oct_24.txt" 也就是说,每个月的每个小时都有一个元素(数据是每天的平均值,所以向量中有288个元素) 有没有办法

我有一个要读入R的文件名列表。目前,文件名是按字母顺序排列的字符向量,因此当我使用向量读入文件时,它们按字母顺序排列在列表中。我想要的是根据月份和小时来排列字符向量(它们以一种不常见的格式包含在文件名中,并且数据文件本身没有日期/时间变量)。我的向量看起来像

chr [1:288] "tair_apr_01.txt" "tair_apr_02.txt" ... "tair_oct_24.txt"
也就是说,每个月的每个小时都有一个元素(数据是每天的平均值,所以向量中有288个元素)

有没有办法重新排列我的向量,这样它就可以按月列出?i、 e

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您可以转换为日期,然后再转换为订单。请注意,我使用的是天而不是小时,因为您有一个小时是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"

filelist您可以转换为日期,然后再转换为订单。请注意,我使用的是天而不是小时,因为您有一个小时是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"
filelist这里是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)
这是一个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)

使用@rawr的
文件列表

filelist[order(strptime(paste0("01_",filelist), "%d_tair_%b_%H"))]
#[1] "tair_jan_01.txt" "tair_apr_12.txt" "tair_dec_24.txt"
所有这些都是为每个时间戳的开始指定一个任意的月份第一天,然后使用它来确保可以生成完整的日期格式

您可以使用
%H
安全地查找
01-24
小时的顺序,而不是
00-23
,根据
?strtime

“%H”小时作为十进制数(00-23)。作为一个特殊的例外字符串 例如“24:00:00”被接受作为输入,因为ISO 8601允许这些输入


使用@rawr的
文件列表

filelist[order(strptime(paste0("01_",filelist), "%d_tair_%b_%H"))]
#[1] "tair_jan_01.txt" "tair_apr_12.txt" "tair_dec_24.txt"
所有这些都是为每个时间戳的开始指定一个任意的月份第一天,然后使用它来确保可以生成完整的日期格式

您可以使用
%H
安全地查找
01-24
小时的顺序,而不是
00-23
,根据
?strtime

“%H”小时作为十进制数(00-23)。作为一个特殊的例外字符串 例如“24:00:00”被接受作为输入,因为ISO 8601允许这些输入


288人的完整名单是否一致?也就是说,这三个“部分”总是用下划线分隔吗?
filelist
的结构并不清楚。例如,您是否可以获得“tair\u apr\u 84.txt”
——即4月的第84个小时?下面的答案是有效的,但是是的,每个文件都有一个统一的名称,格式为“tair\u[month]\u[hr].txt”。至于
文件列表
,小时数的范围是从01到24。数据最初是每个月每天每小时收集一次的,但随后所有数据都是整个月每小时的平均值。288个数据的完整列表是否一致?也就是说,这三个“部分”总是用下划线分隔吗?
filelist
的结构并不清楚。例如,您是否可以获得“tair\u apr\u 84.txt”
——即4月的第84个小时?下面的答案是有效的,但是是的,每个文件都有一个统一的名称,格式为“tair\u[month]\u[hr].txt”。至于
文件列表
,小时数的范围是从01到24。这些数据最初是每月每天每小时收集一次的,但随后所有数据都是整个月每小时的平均值。