在用户定义的函数中使用Dplyr汇总数据,然后绘制数据

时间:2018-11-21 14:30:17

标签: r ggplot2 dplyr aggregate

我试图在函数中使用dplyr创建一个用户定义的函数,该函数可以传递多个参数以使用dplyr汇总数据,然后使用ggplot对其进行绘制。

这是一些示例数据,然后我尝试使用dplyr进行绘制

df <-data.frame(Year = c("2006", "2006", "2006", "2007", "2007", "2007", "2008", "2009", "2010", "2010", "2009", "2009"), JudicialOrientation = c("Defense", "Plaintiff", "Plaintiff", "Neutral", "Defense", "Plaintiff", "Defense", "Plaintiff", "Neutral", "Neutral", "Plaintiff","Defense"), Loss = c(100000, 100, 2500, 100000, 25000, 0, 7500, 5200, 900, 100, 0, 50))

df1 <- df %>%
  group_by(Year, JudicialOrientation) %>%
  summarise(MeanLoss =mean(Loss))

ggplot(df1, aes(x = JudicialOrientation, y = MeanLoss, color = Year, group  =Year)) + 
  geom_line() +
  geom_point()

我现在正尝试将其复制到用户函数中,以便可以传递不同的变量来获得相似的结果。

到目前为止,这是我的尝试:

ConsistencyPlot <- function(df,var1,timevar,lossvar){

  df1 <- df %>%
    group_by_(df[timevar], df[var1]) %>%
    summarise_(MeanLoss = mean(df[lossvar]))

  ggplot(df1, aes(x = var1, y = MeanLoss, color = timevar, group = timevar)) +
    geom_line() +
    geom_point()

}

ConsistencyPlot(df,"JudicialOrientation","Year",'Loss')

我正在复制相同的逻辑,并以df作为数据框,以var1作为JudicialOrientation,以timevar作为Year和{{1} }作为我要通过lossvar平均的Loss值的向量。但是,我无法获得相同的结果,所以我感觉在闭包中如何使用这些功能时我会丢失一些东西。

1 个答案:

答案 0 :(得分:5)

首先,在dplyr函数内部,您不需要调用像df[, timevar]这样的索引数据帧的变量。仅使用变量名。除此之外,在为数据框建立索引时,您必须指定要调用的是列还是行,因此df[timevar]是错误的。

关于功能,这是评估的问题。

下面的结构有效:

ConsistencyPlot <- function(df, var1, timevar, lossvar){
  var1 <- enquo(var1)
  timevar <- enquo(timevar)
  lossvar <- enquo(lossvar)

  df1 <- df %>%
    group_by(!!timevar, !!var1) %>%
    summarise(MeanLoss = mean(!!lossvar))

  ggplot(df1, aes(x = !!var1, y = MeanLoss, color = !!timevar, group = !!timevar)) +
    geom_line() +
    geom_point()
}

请确认参数已使用enquo()进行了转换,然后使用!!传入了函数。因此,您可以在不引用参数的情况下传递参数。

ConsistencyPlot(df, JudicialOrientation, Year, Loss)

我希望您觉得它有用。