Как передать набор данных в pmap?

#r #dplyr #purrr

#r #dplyr #мурлыканье

Вопрос:

Мой tibble выглядит так :

   dataset <- tibble(country = sample(c(11,23,18,17,12,19,30,16,14,13,15),7679,replace = T),yrbirth = floor(runif(7679,1900,1970)))
  

и у меня есть два справочных вектора для проверки условий

 country_code <- c(11,23,18,17,12,19,30,16,14,13,15)

crit_year <- c(1947,1969,1957,1953,1948,1958,1958,1949,1959,1947,1947)    
  

У меня есть функция для выполнения мутации

 f_g_treat <- function(dataset, country_code, crit_year){
  dataset_new <- dataset %>%
    filter(country == country_code) %>%
    mutate(treatment = ifelse(yrbirth >=crit_year-7,'Treat','Contr'))
  return(dataset_new$treatment)
}
  

Теперь я хочу передать набор данных в pmap, но, похоже, это выдает мне ошибку. Моя идея заключалась в следующем

 dataset <- dataset %>%
 mutate(treatment =
 pmap(list(country_code, crit_year), ~f_g_treat(dataset = ., country_code = ..1, crit_year = ..2 )) %>%
           unlist() )
  

При этом я получаю следующую ошибку :

Ошибка: проблема с mutate() вводом treatment . x ни один применимый метод для ‘filter_’, применяемый к объекту класса «c (‘double’, ‘numeric’)», который я ввожу treatment , не является `%>% (...) .

Когда я пытаюсь :

 dataset <- mutate(dataset, treatment =
                pmap(list(country_code, crit_year), ~f_g_treat(dataset = dataset, country_code = ..1, crit_year = ..2 )) %>%
                unlist() )
  

все работает нормально, и я получаю ожидаемый вектор. Итак, я полагаю, что в этой части я неправильно использую анонимную передачу объектов . . Кто-нибудь может мне с этим помочь?

Комментарии:

1. Каков ваш ожидаемый результат? Вы хотите передавать весь набор данных для каждого вызова f_g_treat ? Пример, который, по вашему мнению, работает нормально, не запускается на моем компьютере.

2. Итак, моим ожидаемым результатом должен быть набор данных с третьим столбцом под названием treatment. Который должен равняться вектору, сгенерированному pmap(…) %>% unlist Да, мне нужны данные в каждой итерации, потому что мне нужно сначала отфильтровать некоторые аргументы, прежде чем я изменю.

3. @Bas Обнаружил проблему с MWE. Теперь это должно сработать на вашей стороне. Кроме того, проблема в OP все еще существует.

Ответ №1:

Для вашего конкретного вопроса do решает вашу проблему:

 do(dataset, mutate(., treatment =
                    pmap(list(country_code, crit_year), function(x, y) f_g_treat(dataset = ., country_code = x, crit_year = y )) %>%
                    unlist() )   )      
  

Обратите внимание, что мне пришлось сделать параметры функции pmap явными ( x , y ), чтобы избежать перезаписи . того do , что было создано.

Однако я не думаю, что результат правильный, как и в вашем рабочем примере. treatment Столбец вставлен в неправильном порядке (а именно в порядке country_code, crit_year ), а не в порядке в исходном фрейме данных.

Лучший способ сделать это — с помощью объединения:

 country_crit_year <- tibble(country = country_code, crit_year = crit_year)
dataset %>% 
  left_join(country_crit_year, by = "country") %>% 
  mutate(treatment = if_else(yrbirth >= crit_year-7, "Treat", "Contr"))
  

Ответ №2:

Вы можете сделать следующее:

 dataset %>%
  mutate(treatment = pmap(list(country_code, crit_year), 
                          f_g_treat, 
                          dataset = .) %>% unlist())