dplyr中的条件案例

布莱斯

我试图有条件地对列进行重新排序,但仅当由函数参数指定时才重新排序。我看到显示如何添加条件语句dplyr语句中,(像其他的例子这样),但它不是为我工作。

我有一个包含两列的数据集,如下所示:

Role
1 Primary
2 Secondary
3 Primary
4 Primary

Zap
1 Enabled
2 Disabled
3 Enabled
4 Enabled

我的代码如下所示:

my_bar_chart <- function(data, column, title, change_order=FALSE){
  toReturn <- data %>% 
    group_by({{column}}) %>% 
    summarize(count = n()) %>% 
    mutate(percent = count/sum(count)) %>% 
    mutate(column = reorder({{column}}, -count, FUN=identity)) %>%
    ggplot(aes(x=column, y=count)) +
    xlab(title)+
    geom_col(fill='#cccccc') +
    geom_text(aes(label = paste0(round(100 * percent, 1), "%")))
  return(toReturn)
}
p1 <- my_bar_chart(mydata, Role, "EA5 Controller Role", TRUE)
p2 <- my_bar_chart(mydata, Zap, "Another title", FALSE)

这样就可以了,但是现在当我尝试开始工作时,是第二个mutate语句,当我将TRUE传递给函数change_order参数时,可以有条件地重新排序。这是无效的条件突变:

mutate(column = case_when(
      change_order == TRUE ~ reorder({{column}}, -count, FUN=identity),
      change_order == FALSE ~ column)) %>%

它给了我这个错误:

eval_tidy(pair $ rhs,env = default_env)中的错误:找不到对象“角色”

有什么想法我做错了吗?

阿克伦

第二个条件是返回column且不在内{{}},以及type应该相同的对象

my_bar_chart <- function(data, column, title, change_order=FALSE){
  data %>% 
    group_by({{column}}) %>% 
    summarize(count = n()) %>% 
    mutate(percent = count/sum(count),
           !! rlang::enquo(column) := case_when(change_order ~ 
        reorder({{column}}, -count, FUN=identity), TRUE ~ factor({{column}})) ) %>%
    ggplot(aes(x={{column}}, y=count)) +
      xlab(title)+
      geom_col(fill='#cccccc') +
      geom_text(aes(label = paste0(round(100 * percent, 1), "%")))



    }

测试

my_bar_chart(mydata, Role, "EA5 Controller Role", TRUE)

在此处输入图片说明


请注意,reorder正在为相关的列创建一些属性,case_when由于希望两个表达式具有相同的结构输出,因此将这些属性放入列中相反,我们可以if/else在这里使用

my_bar_chart <- function(data, column, title, change_order=FALSE){
 out <-  data %>% 
    group_by({{column}}) %>% 
    summarize(count = n()) %>% 
    mutate(percent = count/sum(count),
           !! rlang::enquo(column) := if(change_order)
        reorder({{column}}, -count, FUN=identity) else {{column}} )

 print(str(out))
 ggplot(out, aes(x={{column}}, y=count)) +
   xlab(title)+
   geom_col(fill='#cccccc') +
   geom_text(aes(label = paste0(round(100 * percent, 1), "%")))








    }

测试

检查print数据集结构输出

my_bar_chart(mydata, Role, "EA5 Controller Role", TRUE) 
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  2 obs. of  3 variables:
# $ Role   : Factor w/ 2 levels "Primary","Secondary": 1 2
#  ..- attr(*, "scores")= int [1:2(1d)] -3 -1
#  .. ..- attr(*, "dimnames")=List of 1
#  .. .. ..$ : chr  "Primary" "Secondary"
# $ count  : int  3 1
# $ percent: num  0.75 0.25
NULL

my_bar_chart(mydata, Role, "EA5 Controller Role", FALSE)
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  2 obs. of  3 variables:
# $ Role   : chr  "Primary" "Secondary"
# $ count  : int  3 1
# $ percent: num  0.75 0.25

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章