2017-07-17 59 views
4

嗨我通常使用像下面这样的代码重新排序条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") 
+1

小心:你不应该在标识符内使用'.',因为它在使用S3 dispatch时有特定的含义(用'_'代替);你不应该在'TRUE'中使用'T',因为它不是一个保留字并且可以重新定义(对于调皮,'T = FALSE')。 –

+0

也许我完全错了,但我认为这是在R中命名标识符的正确方法。我在[Google的R风格指南](https://google.github.io/styleguide/Rguide.xml#identifiers)中看到它。 –

+0

Google的风格指南通常有点废话。别理他们。这里有一个更好的R风格指南:http://style.tidyverse.org/ - 我不同意一些观点(文件名中的大写字母?!)。但它在R中是绝对可接受和广泛使用的。 –

回答

9

使用<forcats>:

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

'forcats'是如此有用的包 –

3

使用基重排序因数:

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只应在您的因素级别具有有意义的排名顺序时使用,例如“低”,“中”,“高”,即使如此,只有在您正在构建模型并且不希望使用默认对比来比较所有内容时到参考水平。

+0

伟大的了解重新排序。那么'reorder()'和'ordered = TRUE'有什么区别?我的意思是,他们是否修改了因素的不同元素或类似的东西? –

+0

我看到它使用具有分数向量的属性。得到它了! –

+0

'reorder'改变一个因子(或有序因子)的水平的顺序。正如我所说,*所有因素都有他们的水平*。 'factor(...,ordered = TRUE)'创建一个类为“ordered”和“factor”的对象,它具有特殊的对比度和一些比较行为。 (对比,正如我在问题中提到的那样,您可以使用'<' or '>'来比较元素。)除非您需要这些特殊行为,否则不需要'ordered = TRUE'。 – Gregor