根据名称对列进行排序,其中包含日期

时间:2020-07-12 08:32:42

标签: r dplyr lubridate

我有以下数据:

df <- data.frame(id = c(0101, 1011, 2301), flat = c(1, 11, 1), buid = c(1, 10, 23), X2019.12.31.23.59.59 = c(14.123, 12.53, 8.53), X2020.01.31.23.59.59 = c(15.03, 14.63, 9.53), X30.04.2019.23.59 = c(21.03, 17.67, 7.27))

我需要按列名中写的日期顺序排列列。

1 个答案:

答案 0 :(得分:2)

一般的解决方案是将日期和非日期列分开,根据this答案对日期列进行排序,然后将它们组合起来。

library(lubridate)
date_cols <- grep('X\\d+\\.\\d+\\d+', names(df), value = TRUE)
non_date_cols <- grep('X\\d+\\.\\d+\\d+', names(df), value = TRUE, invert = TRUE)

date_cols <- date_cols[order(as.Date(parse_date_time(sub('^X', '', 
                       date_cols), c('YmdHMS', 'dmyHM'))))]
df[c(non_date_cols, date_cols)]

仅保留唯一的日期列,我们可以这样做:

cols <- as.Date(parse_date_time(sub('^X', '', date_cols), c('YmdHMS', 'dmyHM')))
df[c(non_date_cols, date_cols[!duplicated(cols)])]
相关问题