根据包含日期的名称对列进行排序
Sort the column based on the name, which contains the date
我有以下数据:
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))
我需要按照列名中写的日期的顺序排列列。
一个通用的解决方案是将日期列和非日期列分开,根据 答案对日期列进行排序,然后将它们合并。
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)])]
我有以下数据:
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))
我需要按照列名中写的日期的顺序排列列。
一个通用的解决方案是将日期列和非日期列分开,根据
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)])]