【问题标题】:With dplyr and enquo my code works but not when I pass to purrr::map使用 dplyr 和 enquo 我的代码有效,但当我传递给 purrr::map 时无效
【发布时间】:2019-04-10 10:07:03
【问题描述】:

我想为名为日期的向量中的每一列创建一个图。我的数据框只包含这些列,我想对其进行分组,计算出现次数,然后绘制它。

下面的代码有效,除了map,我想用它来遍历以前未知数量的列。我想我正确地使用了map,我之前已经成功了。我是使用 quosures 的新手,但鉴于我的函数调用有效,我不确定出了什么问题。我查看了其他几篇似乎以这种方式设置的帖子。

df <- data.frame(
  date1 = c("2018-01-01","2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-02"),
  date2 = c("2018-01-01","2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-02"),
  stringsAsFactors = FALSE
)
dates<-names(df)

library(tidyverse)

dates.count<-function(.x){
  group_by<-enquo(.x)
  df %>% group_by(!!group_by) %>% summarise(count=n()) %>% ungroup() %>% ggplot() + geom_point(aes(y=count,x=!!group_by))
}
dates.count(date1)
map(dates,~dates.count(.x))

我收到此错误:grouped_df_impl(data, unname(vars), drop) 中的错误:列 .x 未知

【问题讨论】:

  • map(dates, dates.count) 适合你吗?
  • 这确实产生了 2 个图,但它们不正确。 x 轴似乎是字符(或离散),只有列名称作为单轴分隔符,而不是轴上的日期。
  • 什么时候转换为Date 对象?您可能希望在数据生成/修改中的某处包含 %&gt;% mutate_at(vars(date1, date2), funs(as.Date(.)))
  • 在我的真实代码和数据中,列是日期对象(日期是一个向量,仅由数据框中的日期对象的名称组成)。

标签: r ggplot2 dplyr purrr quosure


【解决方案1】:

当您将变量名称传递给map() 时,您使用的是字符串,这表明您需要ensym() 而不是enquo()

所以你的函数看起来像

dates.count <- function(.x){
    group_by = ensym(.x)
    df %>% 
        group_by(!!group_by) %>% 
        summarise(count=n()) %>% 
        ungroup() %>% 
        ggplot() + 
        geom_point(aes(y=count,x=!!group_by))
}

您可以使用变量名作为参数的字符串。

dates.count("date2")

请注意,tidyeval 并不总是能很好地与map() 的公式界面配合使用(我想我没记错)。您总是可以改为使用匿名函数,但在您想要将列名映射到具有单个参数的函数的情况下,您可以这样做

map(dates, dates.count)

使用map()中的公式界面我需要一个额外的!!

map(dates, ~dates.count(!!.x))

【讨论】:

  • 这行得通。我理解您将变量名作为字符串的意思——我曾尝试使用 sym 基于不同的 SO 答案。我不明白为什么使用 '~dates.count(.x)` 不起作用。需要取消引用它需要不同的语法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2018-01-05
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多