如何使用ggplot和dplyr从函数中的quosures创建因子变量?

时间:2017-08-22 19:59:57

标签: r ggplot2 dplyr

这是how to combine ggplot and dplyr into a function?的后续跟进。

问题是,如何编写使用ggplotquosures并可能指定dataframe <- data_frame(id = c(1,2,3,4,5,6), group = c(1,1,0,0,3,4), value = c(200,400,120,300,100,100)) # A tibble: 6 x 3 id group value <dbl> <dbl> <dbl> 1 1 1 200 2 2 1 400 3 3 0 120 4 4 0 300 5 5 3 100 6 6 4 100 中的因子变量的函数?

这是一个例子

group

如您所见,分组变量get_charts1 <- function(data, mygroup, myoutput){ quo_var <- enquo(mygroup) quo_output <- enquo(myoutput) df_agg <- data %>% group_by(!!quo_var) %>% summarize(mean = mean(!!quo_output, na.rm = TRUE), count = n()) %>% ungroup() ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = quo_var, group = quo_var)) + geom_point() + geom_line() } get_charts1(dataframe, mygroup = group, myoutput = value) 在这里是数字,所以

 ggplot(df_agg, aes_q(x = quote(count), 
                       y = quote(mean), 
                       color = factor(quo_var), 
                       group = factor(quo_var))) + 
    geom_point() +
    geom_line() 

将输出一个具有分组变量连续比例的图表,这是不希望的。

enter image description here

理想情况下,我想在运行中定义因子变量。也就是说,在函数中有这样的东西:

NotImplementedType

当然不起作用。

问题是:这里可以做些什么?

谢谢!

1 个答案:

答案 0 :(得分:5)

这是使用其他rlang函数的可能性。

get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  cc <- rlang::expr(factor(!!(rlang::get_expr(quo_var))))
  # or just cc <- expr(factor(!!get_expr(quo_var))) if you include library(rlang)

  ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = cc)) + 
    geom_point() +
    geom_line() 
}

我们使用factor(group)函数构建表达式expr()。我们使用get_expr()从quosure quo_var中提取符号名称“group”。一旦我们构建了表达式,我们就可以将其传递给aes_q

希望ggplot很快就会整齐友好,这将不再是必要的。