Передача имен столбцов в group_by и ggplot2 в пользовательской функции

В моем кадре данных есть несколько категориальных столбцов, я хочу сравнить каждый столбец с фиксированным столбцом и создать гистограмму с facet_grid(). Для этого я хочу написать функцию.

library(rlang)
library(tidyverse)

qw <- structure(list(weekday = structure(c(2L, 6L, 7L, 5L, 1L, 3L, 
  4L, 2L, 6L, 7L, 5L, 1L, 3L, 4L, 2L, 6L, 7L, 5L, 1L, 3L, 4L, 2L, 
  6L, 7L, 5L, 1L, 3L, 4L, 2L, 6L, 7L, 5L, 1L, 3L, 4L), .Label = c("Friday", 
  "Monday", "Saturday", "Sunday", "Thursday", "Tuesday", "Wednesday"
  ), class = "factor"), Target = c(0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 
  0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 
  1, 0, 0, 1), type = structure(c(3L, 3L, 2L, 3L, 1L, 3L, 1L, 3L, 
  1L, 1L, 3L, 2L, 1L, 3L, 3L, 1L, 3L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 
  1L, 3L, 2L, 1L, 2L, 1L, 2L, 1L, 3L, 2L, 3L), .Label = c("Advertising", 
  "Agriculture", "Bank"), class = "factor")), .Names = c("weekday", 
  "Target", "type"), row.names = c(NA, -35L), class = "data.frame")

qw %>%
  group_by(type, Target) %>%
  summarise(Freq = n()) %>%
  ggplot(data = ., aes(x = reorder(type, -Freq), y = Freq, fill = type)) +
  geom_bar(stat = 'identity') +
  labs(y = "", x = "") +
  facet_grid(Target ~ ., scales = "free") + 
  theme(legend.position = 'none')

Здесь столбец Target исправлен для функций group_by() и facet_grid(). Аналогичным образом я хочу сравнить с несколькими столбцами.

Для этого я написал функцию

cateby_label_graph <- function(x){
  x <- syms(x)
  qw %>% 
    group_by(!!!x, Target) %>%
    summarise(Freq = n()) %>% 
    ggplot(data = . , aes(x = reorder(x, -Freq), y = Freq, fill = x)) +
    geom_bar(stat = 'identity') + 
    labs(y = "", x = "") +
    facet_grid(Target~., scales="free") + 
    theme(legend.position = 'none')
}

Вышеупомянутая функция до group_by() работает до получения ошибки.


person dondapati    schedule 29.06.2018    source источник
comment
Как вы назвали свою функцию? В чем ошибка?   -  person Tung    schedule 29.06.2018
comment
@ Tung извините за поздний повтор. я передаю параметр cateby_label_graph('type') и ошибка Don't know how to automatically pick scale for object of type list. Defaulting to continuous. Error in unique.default(x, nmax = nmax) : unique() applies only to vectors   -  person dondapati    schedule 02.07.2018


Ответы (1)


Вам нужно sym (а не syms), и вам нужно убрать x из кавычек, используя !! в вызове ggplot.

# Need ggplot2 3.0.0 to use tidy evaluation in ggplot2
# install.packages("ggplot2", dependencies = TRUE)

library(rlang)
library(tidyverse)

cateby_label_graph2 <- function(df, x) {

  x <- sym(x)

  df %>% 
    group_by(!! x, Target) %>%
    summarise(Freq = n()) %>% 
    ggplot(data = ., aes(x = reorder(!! x, -Freq), y = Freq, fill = !! x)) +
    geom_col() + 
    labs(y = "", x = "") +
    facet_grid(Target ~ ., scales = "free") + 
    theme(legend.position = 'none')
}

cateby_label_graph2(qw, 'type')

Создано 02 июля 2018 г. с помощью пакета reprex (v0.2.0.9000).

person Tung    schedule 02.07.2018
comment
Вам нужна версия для разработчиков ggplot2. См. tidyverse.org/articles/2018/05/ggplot2- 2-3-0 - person Tung; 02.07.2018
comment
@dondapati: кстати, ты можешь использовать geom_col() вместо geom_bar(stat = 'identity') - person Tung; 02.07.2018