【问题标题】:Sort the column based on the name, which contains the date根据包含日期的名称对列进行排序
【发布时间】:2020-07-12 08:32:42
【问题描述】:

我有以下数据:

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))

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

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    一般的解决方案是将日期列和非日期列分开,根据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)])]
    

    【讨论】:

    • 我喜欢第一个解决方案,但效果不佳。我使用了更通用的解决方案。在我订购数据后,结果发现某些列(日期)是重复的。如何删除它们以保留唯一数据?
    • 你的意思是你有同名的列?也许,您可以使用sort,然后使用unique 而不是order 来保持唯一的日期。
    • 列名可能不同。对我来说,隐藏在列名中的日期(没有时间)很重要。例如:[24]“X2019.11.30.23.59.59”[25]“X30.11.2019.23.59”
    • 但是如果两个日期相同的列有不同的值怎么办?如果您只保留一列,您将丢失其中一列的信息,您会保留哪一列?
    • 更有趣的是NA较少的列。但是保持第一列的方案也很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多