Общее решение - разделить столбцы даты и столбцы без даты, отсортировать столбцы даты в соответствии с этим ответом и объединить их.
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)])]