С dplyr и enquo мой код работает, но не когда я перехожу к purrr :: map - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу создать график для каждого столбца в векторе, называемом датами. Мой фрейм данных содержит только эти столбцы, и я хочу сгруппировать его, сосчитать вхождения и затем отобразить его.

Ниже работает код, кроме map, который я хочу использовать, чтобы перейти к ранее неизвестному количеству столбцов. Я думаю, что я правильно использую map, я имел успех с ним раньше. Я новичок в использовании предложений, но, учитывая, что мой вызов функции работает, я не уверен, что не так. Я просмотрел несколько других сообщений, которые, похоже, настроены таким образом.

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 неизвестен

1 Ответ

0 голосов
/ 07 ноября 2018

Когда вы передаете имена переменных в 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...