如何使用R和dplyr排列或排序日期

8
我想按日期列对数据框进行排序。 我的示例数据框:
library(tidyverse)    

dates <- tibble(date = c("01-01-2017", "02-03-2017", "01-02-2017", "02-01-2017", "01-03-2017"), 
                   value = c(8, 12, 4, 14, 11)) 

以下代码无法正常工作,因为它只按照日期进行排序。

arrange(dates, date)

使用lubridate包中的as.Date()dmy()将它们转换为实际日期格式。如果您将日期存储为字符串,则它们将按字母顺序排序。 - m-dz
你需要将日期向量转换为一个Date类,例如dat <- as.Date(dat$date, "%m-%d-%Y")。这里的dat是你tibbly的名称。 - lmo
2个回答

9

根据您的评论,这里存在一个问题,日期数据类型应该以日期的形式存储,而不是一串字符。这样,您就可以按照日期排序和筛选等操作。

当您选择输出信息时,可以将其格式化并使其对人更加友好。

第一个示例将日期转换为实际日期,然后您可以按照该列进行排序/筛选。第二个示例只会对其进行排序,如果您希望执行另一个操作,则需要再次进行转换。

选项1(良好):

dates_mos <- dates %>%
  mutate(date = as.Date(date, "%d-%m-%Y")) %>%
  arrange(date)

输出1:

        date value
      <date> <dbl>
1 2017-01-01     8
2 2017-01-02    14
3 2017-02-01     4
4 2017-03-01    11
5 2017-03-02    12

方案二(不太好):

dates_mos <- dates %>%
  arrange(date = as.Date(date, "%d-%m-%Y"))

输出2:

        date value
       <chr> <dbl>
1 01-01-2017     8
2 02-01-2017    14
3 01-02-2017     4
4 01-03-2017    11
5 02-03-2017    12

1
日期格式应该是%d-%m-%Y,但数据却以%Y-%m-%d的形式呈现。当我使用如下格式进行转换时dates$date <- format(as.Date(dates$date, format = "%Y-%m-%d"), "%d-%m-%Y"),它仍然无法正常工作,并且类别再次转换为字符... - Tdebeus
@Tdebeus,你混淆了日期的文本表示和日期数据类型。前者是一串字符,看起来像日期,但后者是机器可读的日期,只能对后者进行过滤/排序。 - Preston
1
非常好的编辑,谢谢! - Tdebeus
2
使用 arrange(desc(date)) 按日期降序排序。 - trevi

3
您所保存的数据方式不适合按日期排序。它被保存为普通字符串,而您希望R将其识别为日期。使用as.Date()并包括日期字符串的特定格式来解决这个问题。从您的问题中无法确定日期字符串是日-月-年(format = "%d-%m-%Y")还是月-日-年(format = "%m-%d-%Y")。
dates$date <- as.Date(dates$date, format="%d-%m-%Y")
arrange(dates, date)
# 1 2017-01-01     8
# 2 2017-01-02    14
# 3 2017-02-01     4
# 4 2017-03-01    11
# 5 2017-03-02    12

日期格式应该是%d-%m-%Y,但数据给出的结果是%Y-%m-%d。当我像这样格式化它时dates$date <- format(as.Date(dates$date, format = "%Y-%m-%d"), "%d-%m-%Y"),它仍然不起作用,并且类别再次转换为字符... - Tdebeus
as.Date()函数转换后机器可解释的日期格式就是你想要的格式。但是,除非你需要准备某种标准日期格式的报告,否则你想要查看的日期格式并不重要。在报告的情况下,你可以使用你在评论中提到的format()函数将日期格式化数据转换为字符串。 - KenHBS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接