我有以下数据:
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))
我需要按列名中写的日期顺序排列列。
答案 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)])]