【问题标题】:Using tidyeval method with ggplot in R在R中使用带有ggplot的tidyeval方法
【发布时间】:2017-07-14 18:06:26
【问题描述】:

Hadley Wickham 刚刚创建了新的dplyrprogramming 工具,可用于在 dplyr 动词中将字符串作为函数参数传递。我想知道如果 它也可以与ggplot一起使用。

我正在尝试:创建一个将分组变量作为输入的自定义函数,生成计数和给定组中行的百分比百分比。这是代码。这里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

在代码中,p_2 不起作用。 p_1 这是一个黑客作品。是否可以使p_2 工作? 此外,由于p_2 不起作用,我无法在其中添加重新排序(KK 然后 AA 然后 DD)变量,因为我试图通过p_3 进行操作。可能是我想错了方向。可能有一个完全不同的更好的解决方案。

【问题讨论】:

    标签: r ggplot2 dplyr rlang


    【解决方案1】:

    最后,通过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)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2021-08-16
      • 2017-02-26
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多