【问题标题】:How to reorder factor levels in a tidy way?如何以整洁的方式重新排序因子水平?
【发布时间】:2017-12-22 06:23:03
【问题描述】:

您好,我通常使用如下代码来重新排序 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")

【问题讨论】:

  • 小心:你不应该在标识符内部使用.,因为它在使用S3调度时有特定的含义(改用_);并且你不应该使用T 来代替TRUE,因为它不是保留字并且可以重新定义(T = FALSE 表示顽皮)。
  • 也许我完全错了,但我认为这是在 R 中命名标识符的正确方法。我在Google's R Style Guide看到它
  • Google 的风格指南通常有点垃圾。别理他们。这里有一个更好的 R 风格指南:style.tidyverse.org — 我不同意其中的一些观点(文件名中的大写字母?!什么。该死。)但它在 R 中绝对是可以接受和广泛使用的。
  • 好的,看起来很有趣,我去看看!编辑:将 T 更改为 TRUE

标签: r ggplot2 dplyr tidyverse


【解决方案1】:

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

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

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

“与基础 R 相比,此函数按照它们出现的顺序创建关卡”

library(forcats)
iris2 %>% 
    # Change the order
    arrange(mean_sepal_width) %>%  
    # Create factor levels in the order in which they appear
    mutate(Species = as_factor(Species)) %>%
    ggplot() +
    aes(Species, Sepal.Width, color = Species) +
    geom_point()

注意 x 轴上的物种名称不是按字母顺序排列的,而是通过增加它们的 mean_sepal_width 的值来排序的。删除包含as_factor 的行以查看区别。

【讨论】:

    【解决方案2】:

    使用基数重新排序因子:

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

    之后,您可以继续按照您的问题进行总结和绘图。


    几个 cmets:重新排序一个因子就是修改一个数据列。修改数据列的dplyr 命令是mutatearrange 所做的只是重新排序行,这对因子的水平没有影响,因此对 ggplot 中图例或轴的顺序没有影响。

    所有因素都有其水平的顺序。 ordered = TRUE 因子和常规因子之间的区别在于模型中对比度的设置方式。 ordered = TRUE 仅应在您的因子水平具有有意义的排名顺序时使用,例如“低”、“中”、“高”,即使这样,它也仅在您正在构建模型并且不想要默认对比时才重要将所有内容与参考水平进行比较。

    【讨论】:

    • 很高兴了解重新订购。那么reorder()ordered=TRUE 有什么区别呢?我的意思是,他们是否修改了因素的不同元素或类似的东西?
    • 我看到它使用带有分数向量的属性。明白了!
    • reorder 更改因子(或有序因子)水平的顺序。正如我所说,所有因素都有其水平的顺序factor(..., ordered = TRUE) 创建一个具有“ordered”和“factor”类的对象,它对对比和一些比较具有特殊的行为。 (对比,正如我在问题中提到的,您可以使用&lt;&gt; 来比较元素。)除非您需要这些特殊行为,否则不需要ordered = TRUE
    【解决方案3】:

    使用‹forcats›:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2019-04-12
      • 2022-01-10
      • 1970-01-01
      • 2018-12-07
      相关资源
      最近更新 更多