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

ℕʘʘ*_*ḆḽḘ 6 r ggplot2 dplyr

这是如何将ggplot和dplyr组合成一个函数的后续操作.

问题是,如何编写一个使用的函数dplyr,ggplot并可能指定因子变量quosures

这是一个例子

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
Run Code Online (Sandbox Code Playgroud)

如您所见,分组变量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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

 ggplot(df_agg, aes_q(x = quote(count), 
                       y = quote(mean), 
                       color = factor(quo_var), 
                       group = factor(quo_var))) + 
    geom_point() +
    geom_line() 
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.

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

谢谢!!

MrF*_*ick 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() 
}
Run Code Online (Sandbox Code Playgroud)

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

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