#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())