Переупорядочить панели в facet_wrap / facet_grid на основе другого фактора с несколькими вхождениями - PullRequest
1 голос
/ 22 мая 2019

Рассмотрим этот пример.Я хочу создать собственную метку для своих панелей, соединив два столбца в строку.

Панели, созданные с помощью огранки, упорядочены в алфавитном порядке, но на самом деле я хочу, чтобы они были упорядочены по src, поэтому SRC01 долженсначала, затем SRC02 и т. д.

library(tidyverse)

tibble::tibble(
  src = rep(c("SRC03", "SRC04", "SRC01", "SRC02"), 2),
  data = runif(8)
) %>% 
  mutate(
    foo = case_when(src %in% c("SRC01", "SRC02") ~ "foo", TRUE ~ "bar"),
    label = paste(foo, src)
  ) %>% 
  ggplot(aes(x = data)) +
  geom_density() +
  facet_wrap(~label)

Создано в 2019-05-22 пакетом представлением (v0.3.0)

Я знаю, что этот порядок зависит от порядка уровней базовых факторов, но этот вопрос показывает, как вручную указывать уровни, которые мне не нужны (их многобольше SRC значений, и я не хочу вводить их все ...).

Я нашел решение, используя fct_reorder, в котором я мог бы указать:

mutate(label = fct_reorder(label, src, .fun = identity))

Ноэто работает только при наличии одной строки на src/label комбинацию.Если я добавлю данные (т. Е. Более одной точки данных на комбинацию), произойдет сбой с:

Error: `fun` must return a single value per group

Каким будет самый краткий способ добиться того, что мне нужно?

1 Ответ

1 голос
/ 22 мая 2019

Вы можете использовать числовую часть src, а затем использовать reorder():

tibble::tibble(
  src = rep(c("SRC03", "SRC04", "SRC01", "SRC02"), 2),
  data = runif(8)
) %>% 
  mutate(
    foo = case_when(src %in% c("SRC01", "SRC02") ~ "foo", TRUE ~ "bar"),
    label = paste(foo, src)
  ) %>% 
  mutate(label_order = as.numeric(str_extract(src, "\\d+"))) %>% 
# use str_extract() to find the "01" inside "SRC01", turn it to numeric.
  ggplot(aes(x = data)) +
  geom_density() +
  facet_wrap(~reorder(label, label_order)) 
# user reorder to change the ordering based on the numbers

enter image description here


Примечание о str_extract(), оно работает на вашем примере, потому что:

str_extract("SRC01", "\\d+") дает "01", затем преобразуется в 1. Но:

str_extract("2SRC01", "\\d+") вернет 2, что, возможно, не идеально.

К счастью, существует множество способов использования регулярных выражений для извлечения того, что вам может понадобиться.

...