Использование метода tidyeval с ggplot в R

Хэдли Уикхем только что создал новый dplyrинструменты программирования, которые можно использовать для передачи строк в качестве аргументов функций в глаголах 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, Может быть, я думаю в неправильном направлении. Там может быть совершенно другое и лучшее решение.

1 ответ

Наконец, нашел ответ, получив помощь здесь и здесь. Ниже приведен код и сюжет. Мне все еще любопытно, можно ли это сделать лучше.

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

Другие вопросы по тегам