#r #ggplot2
#r #ggplot2 #tidyr
Вопрос:
При неопрятных данных выполнение диаграммы рассеяния, сравнивающей две переменные, является тривиальным либо в базовом R, либо ggplot2
. Например, вот пример диаграммы рассеяния от R for Data Science:
ggplot(data = faithful)
geom_point(mapping = aes(x = eruptions, y = waiting))
Однако при аккуратной версии данных неясно, как построить зависимость длины извержения от времени ожидания, кроме как в виде числовой переменной от категориальной переменной (например, как на boxplot или на графике точек и линий ниже).
Очевидно, что можно было бы работать с исходной «широкой» версией или, в других случаях, использовать spread
команду, но мне интересно, не упускаю ли я простого способа присвоения x
и y
значений по подгруппам в ggplot
? Или, альтернативно, это хороший пример одного ограничения аккуратных данных и варианта использования для широких данных?
tidy_faithful <- faithful %>%
mutate(pair = row_number() %>% # create pair number
as.factor()) %>% # make categorical
tidyr::gather(
eruptions:waiting,
key = "event",
value = "time") %>%
arrange(pair)
> head(tidy_faithful, 4)
pair event time
1 1 eruptions 3.600
2 1 waiting 79.000
3 2 eruptions 1.800
4 2 waiting 54.000
tidy_faithful %>%
slice(1:50) %>% # simplify data
ggplot()
aes(x = factor(event),
y = time,
group = pair)
geom_point()
geom_line()
Комментарии:
1. Я не согласен с тем, что сбор этих данных более аккуратный. Возможно, если вы сначала добавите
key
столбец, чтобы каждое извержение все еще было связано. Но «простой способ присвоения значений x и y по подгруппам» — это не проблема построения графика, это проблема манипулирования данными, поэтому не ищите решение внутри ggplot.2. Я не совсем уверен, исходный формат кажется мне аккуратным — каждое наблюдение содержит одну строку, а каждая переменная (извержения или ожидание) имеет столбец.
3. Знание того, что записи данных в одной строке связаны, даже если нет столбца «номер строки», не является неопрятными данными. Я мог видеть, что аргументы выдвигаются в обоих направлениях относительно столбца
weighting
иeruption
. И ваш вопрос, похоже, является хорошим примером аргумента о том, что он уже аккуратный . Я рад, что вы с энтузиазмом относитесь к tidy data, это отличный принцип — но я думаю, что вы заходите слишком далеко. Возможно, посмотрите на другие, уже аккуратные наборы данных, такие какdiamonds
илиiris
. Они являются хорошими примерами уже аккуратных данных. Иметь несколько столбцов — нормально.4. Подход «грамматики графики» заключается в сопоставлении переменных с эстетикой, поэтому ggplot2 работает лучше всего, когда разные измерения ваших данных находятся в разных столбцах. Если вы хотите сопоставить извержения с ожиданием, и вы думаете о них как о двух атрибутах каждого наблюдаемого цикла извержения, их следует поместить в отдельные переменные перед ggplot. Я не знаю хорошего способа добиться этого в противном случае.
5. Вы, кажется, думаете, что «длинный» и «аккуратный» — это одно и то же. Хотя большинство неопрятных данных слишком обширны, это не единственный способ сделать данные неопрятными.