【问题标题】:Data frame sorting according to column names as dates根据列名作为日期排序的数据框
【发布时间】:2014-04-09 13:49:43
【问题描述】:

我一直在努力解决这个看似简单的问题,我有一个包含以下列名称的数据框:

  names <-  c("2013-1", "2013-10", "2013-11", "2013-12", "2013-2", 
"2013-3", "2013-4", "2013-5", "2013-6", "2013-7", "2013-8", "2013-9", 
"2014-1", "2014-2", "2014-3")

如您所见,列名是日期(由 R 识别为字符),我需要对列重新排序,以便每一列对应于前一列之后的月份,例如。 2013-1、2013-2、2013-3...但由于 R 将列名视为单词而不是日期,因此它的排序方式不同,例如 2013-10 在 2013-2 之前。

我尝试使用以下方法将列名转换为日期:

as.Date(names, format="%Y-%m")

但是 R 显然不能识别这种日期格式,我得到了 NA。无论我尝试什么,我仍然坚持这个顺序,所以非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: r date


    【解决方案1】:

    您还可以查看zoo 包中的as.yearmon。来自帮助文本:“yearmon 是一个表示月度数据的类。”

    library(zoo)
    x <- as.yearmon(names, format = "%Y-%m")
    x
    
    # sort and format output according to taste, e.g.
    format(sort(x), "%Y-%m")
    # [1] "2013-01" "2013-02" "2013-03" "2013-04" "2013-05" "2013-06" "2013-07" "2013-08" "2013-09"
    # [10] "2013-10" "2013-11" "2013-12" "2014-01" "2014-02" "2014-03"
    

    【讨论】:

    • 谢谢,选择它作为答案,因为它可以更快、更简洁地解决我的问题。
    【解决方案2】:

    试试

    as.Date(paste(names, "-01", sep=""), format="%Y-%m-%d")
    

    并且 R 应该将其视为日期。

    编辑:如果您想保留原始格式,但在 1 和 9 之间插入一个零,您可以使用 strftime

    strftime(as.Date(paste(names, "-01", sep=""), "%Y-%m-%d"), "%Y-%m")
    

    【讨论】:

    • 它有效,但并不完全符合我的要求。手动添加日期意味着 R 无法理解 yyyy-mm 日期格式?如果可能,我希望保留原始格式。
    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多