Как получить упорядоченный объект для отформатированной переменной даты? - PullRequest
2 голосов
/ 05 мая 2020

Я хотел бы отформатировать свою переменную даты до %d %b %Y (например, 05 мая 2020 г.). Однако после форматирования она становится символьной переменной, и сортировка переменной от самой ранней даты до самой поздней будет невозможна (например, 5 мая 2020 года сортируется до 26 апреля 2020 года).

Данные:

df <- structure(list(Date = structure(c(1588204800, 1587945600, 1588464000, 1588032000,  
                                        1588291200, 1588377600, 1588118400), class = c("POSIXct", 
                                                                                       "POSIXt"), tzone = "UTC")), class = "data.frame", row.names = c(NA, -7L))
# > df
# Date
# 1 2020-04-30
# 2 2020-04-27
# 3 2020-05-03
# 4 2020-04-28
# 5 2020-05-01
# 6 2020-05-02
# 7 2020-04-29

Вот как это выглядит сортировка отформатированной переменной даты:

df %>% 
  mutate(Date = format(Date, "%d %b %Y")) %>% 
  arrange(Date)
#          Date
# 1 01 May 2020
# 2 02 May 2020
# 3 03 May 2020
# 4 27 Apr 2020
# 5 28 Apr 2020
# 6 29 Apr 2020
# 7 30 Apr 2020

Итак, вот что я сделал, и это работает, но я хотел бы знать, действительно ли это правильно, или есть альтернативы для решения этой проблемы. так что я могу иметь прямой доступ к более читаемым форматам даты при создании моей информационной панели для моих пользователей.

Когда дело доходит до ggplot(), даже после того, как вы сделаете arrange и mutate с format, фасетные сюжеты всегда будут отображаться в отсортированном порядке символов. Пример ниже:

df %>% 
  arrange(Date) %>% 
  mutate(n = 1:n(),
         Date = format(Date, "%d %b %Y")) %>% 
  ggplot() +
  geom_bar(aes(x = n)) +
  facet_wrap(~Date)

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Мое исходное решение приведено ниже, но лучшее решение настолько простое, что оно немного больно, что я не заметил его сразу - сделайте свой arrange() перед своим mutate() - в этот момент он - это переменная типа даты, поэтому она будет отсортирована так, как вы хотите:

df %>% 
  arrange(Date) %>% 
  mutate(Date = format(Date, "%d %b %Y"))

Giving:

         Date
1 27 Apr 2020
2 28 Apr 2020
3 29 Apr 2020
4 30 Apr 2020
5 01 May 2020
6 02 May 2020
7 03 May 2020

В качестве альтернативы вы можете добавить as.Date(..., format = "%d %b %Y") к своему arrange() :

df %>% 
  mutate(Date = format(Date, "%d %b %Y")) %>%
  arrange(as.Date(Date, format = "%d %b %Y"))
2 голосов
/ 05 мая 2020

Если вы хотите использовать даты на графиках, основная идея состоит в том, чтобы отрегулировать уровни факторов в зависимости от порядка, в котором вы хотите отображать данные. arrange сначала даты и уровни фактора присоединения, основанные на появлении дат.

library(dplyr)
library(ggplot2)

df %>% 
  arrange(Date) %>% 
  mutate(n = row_number(),
         Date = format(Date, "%d %b %Y"), 
         Date = factor(Date, levels = unique(Date))) %>% 
  ggplot() + geom_bar(aes(x = n)) + facet_wrap(~Date)

enter image description here

0 голосов
/ 05 мая 2020

Лично я предпочитаю решение tidyverse для дат - lubridate. Здесь:

library(lubridate)

df %>% 
  mutate(Date = ymd(Date)) %>% 
  arrange(Date)

Короче говоря, вы можете анализировать свои даты, комбинируя d для дня, m для месяца и y для года. Вы тоже можете добавить время. Например,

ymd_hms("20150102 12:23:01")

Как показывает пример, нам не нужно беспокоиться о разделителе. Если у вас есть доступ к , этот будет хорошей статьей об этом пакете. В остальном по lubridate есть много руководств.

...