#r #ggplot2 #dplyr #geom-tile
Вопрос:
Я работаю над вопросами R для науки о данных и решениями веб-сайта здесь: https://jrnold.github.io/r4ds-exercise-solutions/exploratory-data-analysis.html.
Вопрос, над которым я работаю, заключается в следующем:
Используйте geom_tile() вместе с dplyr, чтобы изучить, как средние задержки рейсов варьируются в зависимости от пункта назначения и месяца года. Что затрудняет чтение сюжета? Как вы могли бы его улучшить?
Это данные, с которыми они работают, которые поступают из набора данных «рейсы» nycflights123:
dput(head(flights))
structure(list(year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2013L
), month = c(1L, 1L, 1L, 1L, 1L, 1L), day = c(1L, 1L, 1L, 1L,
1L, 1L), dep_time = c(517L, 533L, 542L, 544L, 554L, 554L), sched_dep_time = c(515L,
529L, 540L, 545L, 600L, 558L), dep_delay = c(2, 4, 2, -1, -6,
-4), arr_time = c(830L, 850L, 923L, 1004L, 812L, 740L), sched_arr_time = c(819L,
830L, 850L, 1022L, 837L, 728L), arr_delay = c(11, 20, 33, -18,
-25, 12), carrier = c("UA", "UA", "AA", "B6", "DL", "UA"), flight = c(1545L,
1714L, 1141L, 725L, 461L, 1696L), tailnum = c("N14228", "N24211",
"N619AA", "N804JB", "N668DN", "N39463"), origin = c("EWR", "LGA",
"JFK", "JFK", "LGA", "EWR"), dest = c("IAH", "IAH", "MIA", "BQN",
"ATL", "ORD"), air_time = c(227, 227, 160, 183, 116, 150), distance = c(1400,
1416, 1089, 1576, 762, 719), hour = c(5, 5, 5, 5, 6, 5), minute = c(15,
29, 40, 45, 0, 58), time_hour = structure(c(1357034400, 1357034400,
1357034400, 1357034400, 1357038000, 1357034400), tzone = "America/New_York", class = c("POSIXct",
"POSIXt"))), row.names = c(NA, -6L), class = c("tbl_df", "tbl",
"data.frame"))
Итак, вот ответ, который они дают по ссылке, которой я поделился:
flights %>%
group_by(month, dest) %>% # This gives us (month, dest) pairs
summarise(dep_delay = mean(dep_delay, na.rm = TRUE)) %>%
group_by(dest) %>% # group all (month, dest) pairs by dest ..
filter(n() == 12) %>% # and only select those that have one entry per month
ungroup() %>%
mutate(dest = reorder(dest, dep_delay)) %>%
ggplot(aes(x = factor(month), y = dest, fill = dep_delay))
geom_tile()
labs(x = "Month", y = "Destination", fill = "Departure Delay")
#> `summarise()` regrouping output by 'month' (override with `.groups` argument)
Что приводит к этому:
У меня так много вопросов по этому поводу:
- Во-первых, почему он/она группирует это дважды? Я вижу, что есть начальная группировка по месяцам/dest, но затем они снова группируются по dest двумя строками вниз.
- Далее, какова цель его последующей разгруппировки? Возможно, функция разгруппировки служит какой-то цели, о которой я не знаю, но звучит нелогично.
- Наконец, эти данные все еще не выглядят «чистыми», как того, по-видимому, хочет книга. Конечно, он показывает некоторое сопоставление температуры по месяцам, но пункты назначения, нанесенные на y, выглядят просто как алфавитный суп, поэтому трудно определить какой-либо реальный контекст.
Я предполагаю, что две мои основные проблемы прямо сейчас заключаются в том, что я не понимаю, как они пришли к этому, и я не понимаю, почему это приемлемый ответ, учитывая, что он мало что показывает.
Комментарии:
1. Если мой ответ правильный, пожалуйста, отметьте его как правильный, спасибо.
Ответ №1:
Я отвечу на ваш вопрос по частям.
- Во-первых, почему он/она группирует это дважды? Я вижу, что есть начальная группировка по месяцам/dest, но затем они снова группируются по dest двумя строками вниз.
Ну, во-первых, группировка дважды дает разную информацию. Например, в этом случае они сгруппированы по месту назначения и месяцу.
group_by(month, dest)
Затем эта группа была объединена с обобщением, чтобы рассчитать среднюю задержку отправления в пункте назначения в месяц.
summarise(dep_delay = mean(dep_delay, na.rm = TRUE))
Затем они снова сгруппировались по месту назначения, оттуда они отфильтровали этот сгруппированный набор данных (важно для вопроса 2).
group_by(dest) %>%
filter(n() == 12) %>%
Цель этого состоит в том, чтобы не удалять весь набор данных. Перегруппировка приводит к тому, что операция выполняется по количеству пунктов назначения вместо пункта назначения и месяца. Другими словами, вместо этого мы будем следить за тем, чтобы у каждого пункта назначения было одно количество в один месяц, а не у каждого пункта назначения и месяца было одно количество, поскольку это может быть ложным, если в вашем наборе данных несколько лет. (т. Е. Почему мы фильтруем по 12). Другими словами, наш конечный кадр данных будет представлять собой длинную таблицу с одним пунктом назначения, относящимся ровно к 12 точкам.
- Далее, какова цель его последующей разгруппировки? Возможно, функция разгруппировки служит какой-то цели, о которой я не знаю, но звучит нелогично.
Разгруппировка вовсе не противоречит здравому смыслу, это действительно важно. Группировка, согласно файлу справки, берет существующую таблицу и преобразует ее в сгруппированную таблицу. Это делает так, что операции выполняются группой, а не наблюдением. Разгруппировка отменяет эту функцию. Поскольку операция в этом случае была переупорядочена, автор хотел переупорядочить весь набор данных, а не переупорядочивать каждый пункт назначения по своим собственным точкам.
- Наконец, эти данные все еще не выглядят «чистыми», как того, по-видимому, хочет книга. Конечно, он показывает некоторое сопоставление температуры по месяцам, но пункты назначения, нанесенные на y, выглядят просто как алфавитный суп, поэтому трудно определить какой-либо реальный контекст.
Просмотр графика или даже копирование/сохранение графика на разных мониторах выглядит по-разному. График будет автоматически масштабироваться до размера вашего монитора. Скорее всего, у автора был монитор большего размера, чем у вас, и размеры по умолчанию в их случае были в порядке. Для вас я бы рекомендовал изменить размеры участка или просто увеличить окно вашего участка.
В целом, на ваши вопросы было просто ответить, если бы вы посмотрели файлы справки, поиграли с решением (т. Е. прокомментировали группу, чтобы посмотреть, что произойдет) и действительно изучили сюжет.
Комментарии:
1. Я все время пытаюсь использовать справку в R, но я понятия не имею, что она пытается сказать в половине случаев, даже когда я снова сверяюсь с документацией R, в которой часто есть странно запутанные объяснения даже простых операций для новичков. Я попытался разрезать команду на части, чтобы каждый раз видеть, что она делает, но, поскольку каждая часть, похоже, каждый раз отображает строки в строках данных, это не дает мне хорошего представления о том, что на самом деле происходит. Наверное, у меня все еще много вопросов: почему месяц нужно фильтровать по 12, когда он уже пронумерован? Зачем вам нужны сгруппированные таблицы? Все это сбивает с толку.
2. Его нумеруют по месяцам, а затем фильтр фильтрует по количеству
n()
каждого пункта назначения. Другими словами, он следит за тем, чтобы в каждом пункте назначения было ровно 12 наблюдений. Сгруппированные таблицы, как я объяснил в своем ответе, позволяют выполнять функцию/операцию над определенной группой. Например, если я хочу подсчитать количество пунктов назначения, я бы сгруппировал их по пунктам назначения, а затем использовал функцию суммирования для подсчета. Если бы я хотел подсчитать количество пунктов назначения в месяц, я бы сгруппировал их по пунктам назначения и месяцам, а затем подсчитал. На самом деле это совсем не сбивает с толку.3. Я просто приму ваш ответ, потому что вы, похоже, потратили на это много времени, я просто никогда не могу понять R очень хорошо, независимо от того, сколько раз я в гневе бросаю свой компьютер, пытаясь заставить его делать то, что я хочу.
4. Правильно, так как же вы переходите от «разгруппировать данные», как я уже говорил, к тому, что вы сказали ранее, а именно «это группирует их в таблицу». Это два предложения, которые противоречат друг другу по своему значению. И нет, ты на самом деле не очень внимателен, учитывая, что это уже третий раз, когда ты снисходительно комментируешь, каким идиотом я должен быть, чтобы не понимать. Если вы не хотите помогать, есть тысячи других сообщений, о которых вы можете быть грубыми вместо этого.
5. Я думаю, что также стоит отметить, что
summarize()
изменения, как правило, изменяют статус ваших групп. Он занимает блок строк и (как правило) объединяет их в один. Это означает, что у вас больше нет групп, теперь у вас есть отдельные записи. Поэтому довольно частоgroup_by()
после asummarize()
снова переопределяют ваши «фрагменты» строк, которые вас интересуют.
Ответ №2:
Я согласен, что сюжет трудно прочесть. Я думаю, что это легче понять с более расходящейся цветовой шкалой, меньшими метками по оси y и названиями месяцев вместо цифр, как это:
library(ggplot2)
library(dplyr)
nycflights13::flights %>%
group_by(month, dest) %>%
summarise(dep_delay = mean(dep_delay, na.rm = TRUE)) %>%
group_by(dest) %>%
filter(n() == 12) %>%
ungroup() %>%
mutate(dest = reorder(dest, dep_delay)) %>%
ggplot(aes(
x = factor(month.name[month], levels = month.name),
y = dest,
fill = dep_delay
))
geom_tile()
labs(x = "Month", y = "Destination", fill = "Departure Delay")
scale_fill_gradient(low = "white", high = "red")
theme(
axis.text.y = element_text(size = 4),
axis.text.x = element_text(size = 7),
legend.position = "bottom"
)
Это проясняет, что июнь, июль и декабрь-худшие месяцы.
Комментарии:
1. Спасибо. Это определенно отвечает на третью часть моего вопроса.