forcats
виньетка утверждает, что
Цель пакета forcats - предоставить набор полезных инструментов, которые решают общие проблемы с факторами
И действительно, одним из инструментов является переупорядочение факторов с помощью другой переменной, что является очень распространенным случаем использования при построении данных.Я пытался использовать forcats
для достижения этой цели, но в случае многогранного заговора.То есть я хочу переупорядочить фактор с помощью другой переменной, но используя только подмножество данных.Вот пример:
library(tidyverse)
ggplot2::diamonds %>%
group_by(cut, clarity) %>%
summarise(value = mean(table, na.rm = TRUE)) %>%
ggplot(aes(x = clarity, y = value, color = clarity)) +
geom_segment(aes(xend = clarity, y = min(value), yend = value),
size = 1.5, alpha = 0.5) +
geom_point(size = 3) +
facet_grid(rows = "cut", scales = "free") +
coord_flip() +
theme(legend.position = "none")
Этот код создает сюжет, близкий к тому, что я хочу:
![enter image description here](https://i.stack.imgur.com/FH0FX.png)
Но я хочу ясностиось должна быть отсортирована по значению, поэтому я могу быстро определить, какая ясность имеет наибольшее значение.Но тогда каждый аспект подразумевал бы другой порядок.Поэтому я бы предпочел упорядочить график по значениям в пределах определенного фасета.
Простое использование forcats
, конечно, в этом случае не работает, потому что это будет переупорядочивать факторна основе всех значений, а не только значений конкретного фасета.Давайте сделаем это:
# Inserting this line right before the ggplot call
mutate(clarity = forcats::fct_reorder(clarity, value)) %>%
Затем он создаст этот сюжет.![enter image description here](https://i.stack.imgur.com/aKlT2.png)
Конечно, он переупорядочил коэффициент на основе целых данных, но что если я хочу, чтобы график упорядочился по значениям «идеального» среза ?, Как я могусделайте это с forcats
?
Мое текущее решение будет следующим:
ggdf <- ggplot2::diamonds %>%
group_by(cut, clarity) %>%
summarise(value = mean(table, na.rm = TRUE))
# The trick would be to create an auxiliary factor using only
# the subset of the data I want, and then use the levels
# to reorder the factor in the entire dataset.
#
# Note that I use good-old reorder, and not the forcats version
# which I could have, but better this way to emphasize that
# so far I haven't found the advantage of using forcats
reordered_factor <- reorder(ggdf$clarity[ggdf$cut == "Ideal"],
ggdf$value[ggdf$cut == "Ideal"])
ggdf$clarity <- factor(ggdf$clarity, levels = levels(reordered_factor))
ggdf %>%
ggplot(aes(x = clarity, y = value, color = clarity)) +
geom_segment(aes(xend = clarity, y = min(value), yend = value),
size = 1.5, alpha = 0.5) +
geom_point(size = 3) +
facet_grid(rows = "cut", scales = "free") +
coord_flip() +
theme(legend.position = "none")
Который дает то, что я хочу.
![enter image description here](https://i.stack.imgur.com/zKmTj.png)
Но мне интересно, есть ли более элегантный / умный способ сделать это, используя forcats
.