Передайте взаимодействия между переменными в функцию, используя dplyr / ggplot - PullRequest
0 голосов
/ 31 мая 2018

Я часто нахожу полезным писать функции, которые создают график, используя разные подмножества набора данных.Например, возьмите данные, подобные этим:

id <- seq(1:640)
con1 <- rep(c('hi', 'lo'), each = 320, times = 1)
con2 <- rep(c('up', 'down'), each = 160, times = 2)
con3 <- rep(c('fork', 'knife'), each = 80, times = 4)
con4 <- rep(c('carrot', 'broccoli'), each = 40, times = 8)
likert <- sample(c(1:5), 640, replace = T)

dat <- as.data.frame(cbind(id, con1, con2, con3, con4, likert))

Я хотел бы иметь функцию, которая создала бы граненый график для любой комбинации указанных мной переменных con1: 4.Упрощенная версия того, что я хотел бы, выглядит следующим образом:

groupVar <- 'con1'

plotFunction <- function(groupVar) {

  plot <- ggplot(data = dat) +
    geom_bar(aes(x = factor(likert))) +
    facet_wrap(~eval(parse(text = groupVar))) +
    ggtitle(paste('Preferences grouped by ',groupVar)) + 
    theme_bw()

  return(plot)

}

plotFunction(groupVar = groupVar)

Это работает для передачи отдельных переменных, но не тогда, когда я хочу построить взаимодействие.Например, установка для groupVar значения 'con1 * con2' не приведет к желаемому результату, т. Е. К графику, который я получу, вручную указав

facet_wrap(~con1*con2)

. Я понимаю (без сомнения, на довольно поверхностном уровне), почемуэто не работает, но не смог найти решение.Мой обходной путь состоял в том, чтобы создать новые переменные для каждого взаимодействия, чтобы затем я мог передать взаимодействие в facet_wrap как одну переменную - например, для взаимодействия con1 * con2:

dat <- dat %>%
  mutate(con1_con2 = paste(con1, con2, sep = '_'))

groupVar <- 'con1_con2'

plotFunction(groupVar = groupVar) 

дает желаемый результат.

Буду признателен за любые советы о том, как передать взаимодействия функции через переменную groupVar (или каким-либо другим методом), чтобы не создавать новые переменные.

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать синтаксис аргумента символьного вектора вместо формулы ~ формулы ( документы ):

groupVar <- c('con1','con2')

plotFunction <- function(groupVar) {

  plot <- ggplot(data = dat) +
    geom_bar(aes(x = factor(likert))) +
    facet_wrap(groupVar) +
    ggtitle(paste('Preferences grouped by ', paste0(groupVar, collapse="*"))) + 
    theme_bw()

  return(plot)

}

plotFunction(groupVar = groupVar)

enter image description here

Только не забудьте обновить ggtitle команду вставки.

...