【问题标题】:Sorting date m/y format in a data frame in R在R中的数据框中对日期m / y格式进行排序
【发布时间】:2017-06-08 13:07:42
【问题描述】:

我正在尝试对格式为 M/Y 的日期列进行排序。我尝试使用其他帖子中给出的几种方法,但没有任何帮助。请建议。 对于 2012 年,它正确显示了 2012 年给出的所有月份,但随后它改变了模式。谢谢你。

Here is how it looks like currently

【问题讨论】:

  • 欢迎来到 SO。请查看有关如何生成minimum, complete, and verifiable example 的这些提示,以及creating a great example in R 上的这篇文章。您没有使用日期变量。它可能是一个因子变量,但也可能是一个字符变量。您必须将其转换为字符,使用 strsplitpastegsub 将格式设置为 Y/M。在个位数月份前包含 0(01 表示一月)。然后它将正确排序。

标签: r sorting sql-order-by


【解决方案1】:

应该可以的:

#let's add a column to your data.frame with a proper date
df$date_of_first_day <- as.Date(paste0("1/",monyear),format = "%d/%m/%y")
# then sort the data.frame
df <- df[order(df$date_of_first_day,decreasing = FALSE),]
# then get rid of this column
df$date_of_first_day <- NULL

【讨论】:

  • 这就像一个魅力。我正在做同样的事情,但作为一个热门尝试,因为我对 R 中的语法还不熟悉。在每个命令之前你的 cmets 有助于理解流程。非常感谢。
  • 不客气,我刚刚更正了最后一行,虽然有一点错误:)。如果它适合您,请考虑验证答案。
  • 感谢您的来信。尽管我在代码中进行了更正,但我不知道我可以编辑它。
【解决方案2】:

1) 这会将 DF(见注)转换为动物园时间序列,其第一列是 yearmon 类并按其排序。

library(zoo)

z <- read.zoo(DF, FUN = as.yearmon, format = "%m/%y")

您可能希望将其保留为上述动物园对象或将其转换回数据框:

fortify.zoo(z)

2) 这是 read.zoo 的替代方案。它还使用类 yearmon。

library(zoo)

DF2 <- transform(DF, monyear. = as.yearmon(monyear., "%m/%y"))
DF2[order(DF2$monyear.), ]

注意:以上使用DF定义为:

library(tesseract)
u <- "https://i.stack.imgur.com/Szlhw.png"
DF <- read.table(text = ocr(u), header = TRUE, as.is = TRUE)

【讨论】:

    【解决方案3】:

    使用lubridatedplyr

    library(dplyr)
    library(lubridate)
    df <- data.frame( monyear = c( "1/12", "10/13", "1/13", "2/10" ), 
                      amount = 1:4, 
                      prices = 1:4 )
    

    原始数据:

      monyear amount prices
    1    1/12      1      1
    2   10/13      2      2
    3    1/13      3      3
    4    2/10      4      4
    

    按日期排序:

    df <- df %>%
          arrange( parse_date_time(monyear,"my") )
    

    函数parse_date_time将读取格式为“我的”或“月年”

    输出:

      monyear amount prices
    1    2/10      4      4
    2    1/12      1      1
    3    1/13      3      3
    4   10/13      2      2
    

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 2019-08-20
      • 1970-01-01
      • 2015-01-07
      • 2018-01-19
      • 2022-09-27
      • 1970-01-01
      • 2013-02-10
      • 2017-10-07
      相关资源
      最近更新 更多