【问题标题】:Pass interactions between variables to a function using dplyr/ggplot使用 dplyr/ggplot 将变量之间的交互传递给函数
【发布时间】:2018-11-09 22:59:21
【问题描述】:

我经常发现编写使用数据集的不同子集创建绘图的函数很有用。例如,获取如下数据:

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 变量(或其他方法)将交互传递给函数的任何建议,以便无需创建新变量。

【问题讨论】:

    标签: r function ggplot2 parameter-passing


    【解决方案1】:

    您可以使用字符向量参数语法代替 ~ 公式语法 (docs):

    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)
    

    记得更新 ggtitle 粘贴命令。

    【讨论】:

    • 非常酷,谢谢。当我看到您已将其添加到您的答案中时,正试图弄清楚如何更新 ggtitle() 代码。
    • 不客气。幸运的是,paste0 命令将忽略 collapse 参数,当它试图粘贴的向量中只有一个东西时,所以如果你只有一个方面,它只会读取 con1(或其他)。
    • 抱歉,还有一个问题 - 是否有一种方法可以同时与 dplyr group_by() 一起使用?例如dat$likert &lt;- as.character(dat$likert) dat$likert &lt;- as.numeric(dat$likert) groupVar &lt;- c('con1', 'con2') means &lt;- dat %&gt;% group_by(groupVar) %&gt;% summarise(mean = mean(likert)) %&gt;% as.data.frame() 不起作用。
    • 使用group_by_at:group_by_at(vars(groupVar))
    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多