r - 在用户定义的函数中使用 Dplyr 来汇总数据然后绘制它

标签 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 作为 JudicialOrientationtimevar 作为 Yearlossvar 作为我希望通过 summarise 平均的 Loss 值的向量。然而,我无法获得相同的结果,所以我觉得我遗漏了一些有关如何在闭包中使用这些函数的信息。

最佳答案

首先,在 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)

希望您觉得它有用。

关于r - 在用户定义的函数中使用 Dplyr 来汇总数据然后绘制它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414314/

相关文章:

r - 为什么对于整数向量 x,as(x, "numeric") 会触发加载额外的 S4 方法以进行强制?

r - 安排多个 ggplots,但避免由于轴标签而被压扁

r - 在ggplot2热图中为相同值获取不同的颜色

r - 在 facet_wrap 标签上显示注释

r - summarise_at 对不同的变量使用不同的函数

r - dplyr 0.7.0 tidyeval 包

r - ggplot2 可以找到交叉点 - 还是有其他巧妙的方法?

r - 确定哪些 R 包和依赖项使用 DLL 文件

r - 计算ggplot2中的折线图

r - dplyr::count() 多列