1

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

下面的代码有效,除了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未知

4

1 回答 1

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))
于 2018-11-07T00:39:05.917 回答