Могу ли я хронологически упорядочить даты как символы в R?

У меня есть данные в формате .csv. Первый столбец — даты, второй столбец — количество дней. Я хочу построить количество дней по сравнению с датой. (см. здесь)

В моем .csv даты расположены в хронологическом порядке по годам. В RStudio начальный график хронологичен по номеру месяца.

install.packages("tidyverse")
library(tidyverse)
#load my spreadsheet
openingData <- read_csv("daysPriorToOpening.csv")
ggplot(data = openingData) +
    geom_col(mapping = aes(x = dateOpened, y = daysPrior) +
    labs(x = "Date Opened", y = "Days prior to opening at or above 11.0")

Это создает вывод это, упорядоченный по номеру месяца. Мне нравится внешний вид, только не порядок. Кто-то предложил мне попробовать использовать as.Date()

openingData$dateOpened <- as.Date(openingData$dateOpened, format = "%m/%d/%Y")

Затем я снова запустил код для построения графика, и он был построен в хронологическом порядке, но теперь есть большие пробелы. См. здесь. Даты не помечены, как на первом изображении; читатель должен угадать точную дату.

Я предполагаю, что другой внешний вид заключается в том, что в первом случае даты являются символами и дискретными. Во втором случае использование as.Date() изменило их на Даты, и они стали непрерывными. Есть ли способ,

  1. сохранить отображение в качестве первого графика, но упорядочить его по годам, или
  2. отображать как на втором графике, но либо устранить пробелы или пометить столбцы соответствующей датой?
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно преобразовать даты в фактор и упорядочить уровни факторов в соответствии с датой, которую они представляют. Это включает в себя преобразование в дату, упорядочивание, а затем обратное преобразование.

dates <- as.Date(openingData$dateOpened, format = "%m/%d/%y")
levs  <- strftime(sort(dates), format = "%m/%d/%y")
openingData$dateOpened <- factor(strftime(dates, format = "%m/%d/%y"), levs)
                                 

ggplot(data = openingData) +
    geom_col(mapping = aes(x = dateOpened, y = daysPrior)) +
    labs(x = "Date Opened", y = "Days prior to opening at or above 11.0")

Спасибо, я ценю это! Как вы думаете, это лучшая визуализация того, что я хочу отобразить? Я предполагаю, что тот, который у меня был, где ось X была датами, может быть лучшим, но, как я уже сказал, мне не нравились большие пробелы. Я также разместил вопрос на Reddit, и пользователь предложил график разброса.

cap 19.03.2022 02:51
Ответ принят как подходящий
openingData %>% 
  mutate(dateOpened = as.Date(dateOpened,"%m/%d/%y")) %>% 
  arrange(dateOpened) %>% 
  mutate(id = factor(row_number(),labels = dateOpened)) %>% 
  ggplot() + 
  geom_col(mapping = aes(x = id, y = daysPrior))+
  labs(x = "Date Opened", y = "Days prior to opening at or above 11.0")

Отлично, спасибо!<br/> Как вы думаете, подходит ли geom_col? Я также разместил свой первоначальный вопрос на Reddit, и ответивший не подумал, что это лучше всего использовать. Они предложили диаграмму рассеяния, поскольку данные представляют собой дискретные точки. У меня нет опыта работы со статистикой или визуализацией данных. Я думал, что с колонками это легко увидеть; Я думаю, это так же легко увидеть с диаграммой рассеяния.<br/>Интересно узнать больше, поскольку я пытаюсь узнать, что лучше.

cap 18.03.2022 15:43

В целом соглашусь, что это, наверное, не лучшая визуализация. Ось x сбивает с толку - это дата, но мы манипулировали здесь, чтобы исключить числовое значение из даты (т.е. расстояние между датами естественным образом не используется)

langtang 18.03.2022 16:05

Разброс тоже возможен - я думаю, это зависит от того, что вы пытаетесь сообщить: вы можете изменить свою колонку dateOpened на настоящую дату, а затем попробовать ggplot(openingData, aes(dateOpened, daysPrior)) + geom_point(size=4)+ ylim(0,100) + geom_text(aes(label=daysPrior),nudge_y=3)

langtang 18.03.2022 16:05

Другие вопросы по теме