2017-07-14 58 views
1

Hadley Wickham剛剛創建了新的dplyrprogramming工具,可用於在dplyr動詞中將字符串作爲函數參數傳遞。我想知道是否 它也可以與ggplot一起使用。在R中使用ggplot的tidyeval方法

我在嘗試:要創建一個自定義函數,它將一個分組變量作爲輸入,生成計數計數和給定組中行的比例百分比。這是代碼。這裏gprop是 「組比例」,」功能。

library(magrittr) 
library(dplyr) 

gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot 
     grouping_var_enc = enquo(grouping_var) 
     df2 = df1 %>% group_by(UQ(grouping_var_enc)) %>% tally %>% mutate(`%` = round(100*n/nrow(df1))) %>% 
     arrange(desc(!!grouping_var_enc)) %>% print 

    if(ggp){ 
    p_1 = df2 %>% ggplot(aes_string(x = names(df2)[1],y='n')) + geom_bar(stat='identity') + xlab(enquo(grouping_var)) 
    # p_2 = df2 %>% ggplot(aes(x = UQ(grouping_var_enc),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var)) # this does not work 
    # p_3 = df2 %>% ggplot(aes(x = reorder(grouping_var,-n),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var)) 

    print(p1) 
    } 
} 
set.seed(100) 
df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print 
gprop(df1,a,TRUE) 

以下是輸出和情節。

#R>set.seed(100) 
#R>df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print 
# A tibble: 10 x 2 
a     b 
<chr>    <dbl> 
1 AA 0.3186300876170320 
2 AA -0.5817906847159104 
3 DD 0.7145327108915683 
4 AA -0.8252594258627688 
5 DD -0.3598621313954654 
6 DD 0.0898861437775305 
7 KK 0.0962744602851301 
8 DD -0.2016339521833545 
9 DD 0.7398404998784306 
10 AA 0.1233795010888694 
#R>gprop(df1,a,TRUE) 
# A tibble: 3 x 3 
a  n `%` 
<chr> <int> <dbl> 
1 KK  1 10 
2 DD  5 50 
3 AA  4 40 

enter image description here

在代碼中,p_2不起作用。p_1這是一個黑客工作。是可能使p_2工作? 另外,因爲p_2不起作用,我不能添加一個重新訂購(KK然後AA然後DD)變量那裏,因爲我是tryi通過p_3來完成。可能是我在錯誤的方向思考。可能有一個完全不同的更好的解決方案。

回答

0

最後,通過從herehere獲得幫助找到答案。以下是代碼和情節。如果能以更好的方式做到這一點,我仍然很好奇。

gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot 

    grouping_var_enc = enquo(grouping_var) 
    df2 = df1 %>% 
    group_by(UQ(grouping_var_enc)) %>% tally %>% 
    mutate(`%` = round(100*n/nrow(df1))) %>% 
    arrange(desc(!!grouping_var_enc)) %>% print 

    if(ggp){ 
    p_1 = df2 %>% 
     ggplot(aes_string(paste0("reorder(",quo_name(grouping_var_enc),",-n)"),y='n')) + 
     geom_bar(stat='identity') + xlab(enquo(grouping_var)) 
    print(p_1) 
    } 
} 

enter image description here