如何以整洁的方式重新排序因子水平?

时间:2017-07-17 16:09:14

标签: r ggplot2 dplyr tidyverse

您好我通常使用以下代码来重新排序ggplot中的条形码 或其他类型的情节。

正常情节(无序)

library(tidyverse)
iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct()
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
  geom_point(stat = "identity")

订购因子+有序情节

iris.tr$Species <- factor(iris.tr$Species,
                          levels = iris.tr[order(iris.tr$mSW),]$Species,
                          ordered = TRUE)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")

因素线对我来说非常不愉快,我想知道为什么arrange()或其他一些功能无法简化这一点。我错过了什么?

注意:

这不行,但我想知道tidyverse中是否存在这样的东西。

iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct() %>% 
  arrange(mSW)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")

3 个答案:

答案 0 :(得分:14)

使用<forcats>:

iris.tr %>%
    mutate(Species = fct_reorder(Species, mSW)) %>%
    ggplot() +
    aes(Species, mSW, color = Species) +
    geom_point()

答案 1 :(得分:5)

使用base重新排序因子:

iris.ba = iris
iris.ba$Species = with(iris.ba, reorder(Species, Sepal.Width, mean))

翻译为dplyr

iris.tr = iris %>% mutate(Species = reorder(Species, Sepal.Width, mean))

之后,您可以继续总结并在问题中进行策划。

一些评论:重新排序一个因素是修改数据列。用于修改数据列的dplyr命令是mutate。所有arrange都是重新排序的行,这对因子的级别没有影响,因此对ggplot中的图例或轴的顺序没有影响。

所有因素都有订单。 ordered = TRUE因子与常规因子之间的差异在于如何在模型中设置对比度。 ordered = TRUE只应在您的因子级别具有有意义的排名顺序时使用,例如“低”,“中”,“高”,即使这样,只有在构建模型并且不希望默认对比将所有内容与参考水平进行比较。

答案 2 :(得分:0)

如果您碰巧要订购一个字符向量,例如:

iris2 <- iris %>% 
    mutate(Species = as.character(Species)) %>% 
    group_by(Species) %>% 
    mutate(mSW = mean(Sepal.Width)) %>% 
    ungroup()

您还可以使用forcats :: as_factor函数的行为对因子水平进行排序:

  

“与基R相比,此功能按其出现的顺序创建级别”

library(forcats)
iris2 %>% 
    arrange(mSW) %>%  
    mutate(Species = as_factor(Species)) %>%
    ggplot() +
    aes(Species, mSW, color = Species) +
    geom_point()