【问题标题】:Using Dplyr within a user-defined function to summarise data then plot it在用户定义的函数中使用 Dplyr 来汇总数据然后绘制它
【发布时间】:2018-11-21 14:30:17
【问题描述】:

我正在尝试在一个函数中使用 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 作为我想要的Loss 值的向量平均通过summarise。但是我不能得到相同的结果,所以我觉得我在闭包中如何使用这些函数时遗漏了一些东西。

【问题讨论】:

    标签: r ggplot2 dplyr aggregate


    【解决方案1】:

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

    希望对你有用。

    【讨论】:

    • 我意识到我在发布此问题后立即引用了错误的列名。你能给我解释一下吗!!是在做?这正是我想要的。非常感谢。
    • 它是一个不带引号的运算符。见?"!!"
    • 这正是@Anonymouscoward 所说的。如需更深入的解释,请查看here。乐于助人。
    • 我想我只是想弄清楚为什么引用-取消引用方法有效,而不是仅以未引用的形式发送参数。如果我将它们发送进来,它无法识别变量,那么为什么当它们被引用然后立即用 !! 引用时它会起作用。我阅读了 ?enquo ,如果我理解正确,quosure 会保持原来的环境,但是只是为了评估目的而删除引号?
    • @Coldchain9:更多解释请参见stackoverflow.com/questions/51738267/…
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2021-05-07
    • 2020-11-04
    • 1970-01-01
    • 2014-10-14
    • 2020-12-27
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多