【问题标题】:How to reorder a factor based on a subset (facets) of another variable, using forcats?如何使用 forcats 根据另一个变量的子集(方面)对因子重新排序?
【发布时间】:2019-01-29 22:58:34
【问题描述】:

forcatsvignette 声明

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")

这段代码产生的情节接近我想要的:

但我希望净度轴按值排序,这样我可以快速找出哪个净度值最高。但是每个方面都意味着不同的顺序。所以我想选择按特定方面内的值对图进行排序。

forcats 的直接使用当然在这种情况下不起作用,因为它会根据所有值重新排序因子,而不仅仅是特定方面的值。让我们开始吧:

# Inserting this line right before the ggplot call
mutate(clarity = forcats::fct_reorder(clarity, value)) %>%

然后它会产生这个情节。

当然,它根据整个数据对因子进行了重新排序,但是如果我想要按“理想”切割值排序的情节怎么办?,我该如何使用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")

这会产生我想要的。

但我想知道是否有更优雅/更聪明的方法来使用forcats

【问题讨论】:

    标签: r forcats


    【解决方案1】:

    如果您想通过特定方面的值对 clarity 重新排序,您必须告诉 forcats::fct_reorder() 这样做,例如,

    mutate(clarity = forcats::fct_reorder(
        clarity, filter(., cut == "Ideal") %>% pull(value)))
    

    仅使用“理想”方面的值进行重新排序。

    因此,

    ggplot2::diamonds %>% 
      group_by(cut, clarity) %>% 
      summarise(value = mean(table, na.rm = TRUE)) %>%
      mutate(clarity = forcats::fct_reorder(
        clarity, filter(., cut == "Ideal") %>% pull(value))) %>%
      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")
    

    创造

    根据要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2023-03-15
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多