2017-07-14 56 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