使用dplyr和enquo,我的代码可以工作,但当我传递到purr::map时就不行了
我想为名为dates的向量中的每一列创建一个绘图。我的数据框只包含这些列,我想对其进行分组,计算出现次数,然后进行打印 下面的代码可以工作,除了使用dplyr和enquo,我的代码可以工作,但当我传递到purr::map时就不行了,r,ggplot2,dplyr,purrr,quosure,R,Ggplot2,Dplyr,Purrr,Quosure,我想为名为dates的向量中的每一列创建一个绘图。我的数据框只包含这些列,我想对其进行分组,计算出现次数,然后进行打印 下面的代码可以工作,除了map,我想用它来遍历以前未知数量的列。我想我正确地使用了map,我以前用过它。我不熟悉使用quosures,但考虑到我的函数调用是有效的,我不确定到底出了什么问题。我已经看过了其他几个似乎是这样设置的帖子 df <- data.frame( date1 = c("2018-01-01","2018-01-01","2018-01-01","2
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))
df%ggplot()+几何点(aes(y=计数,x=!!分组依据))
}
日期。计数(日期1)
映射(日期,~dates.count(.x))
我得到了这个错误:分组的_df_impl(data,unname(vars),drop)中的错误:
.x
列未知当您将变量名传递给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))
}
请注意,tidyeval并不总是能很好地使用map()
(我想我记对了)。您总是可以改为使用匿名函数,但如果您希望将列名映射到具有单个参数的函数,则只需执行以下操作即可
map(dates, dates.count)
使用map()
中的公式接口,我需要一个额外的代码>:
map(dates, ~dates.count(!!.x))
map(dates,dates.count)
对您有用吗?这会生成两个绘图,但它们不正确。x轴看起来是字符(或离散的),只有列名作为单轴分隔符,而不是轴上的日期。在什么时候转换为Date
对象?您可能希望在数据生成/管理中包含%>%mutate_at(vars(date1,date2),funs(as.Date())
。在我的真实代码和数据中,列是日期对象(日期是一个向量,仅由数据框中日期对象的名称组成)。这很有效。我理解你所说的变量名是字符串的意思——我试着根据不同的答案使用sym
。我不明白的是为什么使用“~dates.count(.x)”不起作用。关于是否需要取消引用它需要不同的语法?
map(dates, ~dates.count(!!.x))