2017-08-22 11 views
5

これはhow to combine ggplot and dplyr into a function?からのフォローアップです。ggplotとdplyrを使用して関数内のquosuresから因子変数を作成する方法は?

問題は、dplyr,ggplot、おそらくquosuresの因子変数を指定する関数を書く方法です。ここで

は、グループ化変数のための継続的な規模で

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) 

意志出力グラフを、そう、たとえば

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がここに数値であります望ましくない。

enter image description here

理想的には、私はオンザフライ因子変数を定義したいと思います。つまり、関数内に次のようなものがあります。

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

これはもちろん動作しません。

質問:ここでは何ができるのですか?

ありがとうございます!

答えて

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() 
} 

我々はexpr()機能を使用して式factor(group)を構築します。 を使用して、quo_varの口座から「group」というシンボル名を抽出します。式を作成したら、aes_qに渡すことができます。

うまくいけば、ggplotはまもなく控えめに評価され、これはもはや必要ないでしょう。

+0

非常に甘い!ありがとう! 'value' varの簡単な操作でこの関数を呼び出すと、実際に動作することになります:say' get_charts1(dataframe、 mygroup = group、 myoutput = log(value)) ' –

関連する問題