【问题标题】:Conditional case inside dplyrdplyr 中的条件案例
【发布时间】:2020-04-16 23:33:23
【问题描述】:

我正在尝试有条件地重新排序列,但仅在由函数参数指定时。我看到其他示例展示了如何在 dplyr 语句中添加条件(如 this),但它对我不起作用。

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

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) 中的错误:对象“角色”不 找到了

任何想法我做错了什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    第二个条件是返回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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2011-10-25
      • 2014-04-16
      相关资源
      最近更新 更多