从%>%管道运算符获取倒数第二个输入

问题描述

我想从我刚在管道中创建的列中考虑因素。 我可以使用以下代码进行此操作:

library("dplyr")
library("magrittr")
library("janitor")

iris <- iris %>% janitor::clean_names()    
iris %>% filter(species %in% c("setosa","versicolor")) %>% group_by(species) %>% 
             summarise(mean_sepal_length = mean(sepal_length)) %>% ungroup() %>%
             mutate(species = factor(species,levels = (iris %>% group_by(species) %>%  #<- works but messy
                                                            summarise(mean_sepal_length = mean(sepal_width)) %>% 
                                                            ungroup() %>% arrange(mean_sepal_length) %$% species))) %>% 
                    arrange(species)

我想知道是否有“更清洁”的方法。像这样的东西:

iris %>% filter(species %in% c("setosa","versicolor")) %>% group_by(species) %>% 
     summarise(mean_sepal_length = mean(sepal_length)) %>% ungroup() %>%
     mutate(species = factor(species,levels = (. %>% arrange(mean_sepal_length) %$% species))) %>% 
            arrange(species)

在哪里.是倒数第二个,而不是倒数第二个?

这会引发错误,因为管道的最后一个参数是mutate语句:

Error: Problem with `mutate()` input `species`. x 'match' requires vector arguments i Input `species` is `factor(...)`.

我认为从根本上讲,这不是管道操作员的工作方式,因此这不可能。

解决方法

要使第二个选项起作用,我们可以将.包裹在{}

library(dplyr)
library(magrittr)
iris %>% 
 filter(species %in% c("setosa","versicolor")) %>%
 group_by(species) %>% 
 summarise(mean_sepal_length = mean(sepal_length)) %>% 
 ungroup() %>%
 mutate(species = factor(species,levels = ({.} %>%
                  arrange(mean_sepal_length) %$% species))) %>%
 arrange(species)
# A tibble: 2 x 2
#  species    mean_sepal_length
#  <fct>                  <dbl>
#1 setosa                  5.01
#2 versicolor              5.94
,

您可以arrange基于mean_sepal_length的数据,然后使用factor根据unique的级别分配它们。

library(dplyr)

iris %>% 
  filter(species %in% c("setosa","versicolor")) %>%
  group_by(species) %>% 
  summarise(mean_sepal_length = mean(sepal_length)) %>%
  arrange(mean_sepal_length) %>%
  mutate(species = factor(species,levels = unique(species)))

#  species    mean_sepal_length
#  <fct>                  <dbl>
#1 setosa                  5.01
#2 versicolor              5.94