1

考虑这个例子。我想通过将两列连接成一个字符串来为我的面板创建一个自定义标签。

通过 faceting 创建的面板按字母顺序排列,但实际上,我希望它们按 排序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)

reprex 包(v0.3.0)于 2019-05-22 创建

我知道这个顺序取决于潜在因素水平的顺序,但是这个问题显示了如何手动指定我不想要的水平(还有更多的SRC值,我不想输入所有这些......)。

我找到了一个解决方案fct_reorder,我可以在其中指定:

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

但这仅在每个src/label组合有一行时才有效。如果我添加数据(即,每个组合不止一个数据点),它会失败并显示:

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

实现我需要的最简洁的方法是什么?

4

1 回答 1

1

您可以使用 的数字部分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

在此处输入图像描述


关于 的注释str_extract(),它适用于您的示例,因为:

str_extract("SRC01", "\\d+")给出"01",然后转换为1。但:

str_extract("2SRC01", "\\d+")会返回2,这可能不太理想。

幸运的是,有很多方法可以使用正则表达式来提取您可能需要的内容。

于 2019-05-22T09:50:12.993 回答