Я пытаюсь сжать рабочий поток %>%
, в котором мне нужно применить одну и ту же функцию к нескольким столбцам, но каждый раз менялся один аргумент. Я чувствую, что функции purrr
* map
или invoke
должны помочь, но я не могу обернуться вокруг этого.
В моем фрейме данных есть столбцы для ожидаемой продолжительности жизни, уровня бедности и среднего дохода домохозяйства. Я могу передать все эти имена столбцов в vars
в mutate_at
, использовать round
в качестве функции, применяемой к каждому, и при желании предоставить аргумент digits
. Но я не могу найти способ, если он существует, передавать различные значения для digits
, связанные с каждым столбцом. Я бы хотел, чтобы ожидаемая продолжительность жизни была округлена до 1 цифры, бедность - до 2, а доход - до 0.
Я могу вызвать mutate
для каждого столбца, но, учитывая, что у меня может быть больше столбцов, получающих одну и ту же функцию с измененным только дополнительным аргументом, я хотел бы что-то более краткое.
library(tidyverse)
df <- tibble::tribble(
~name, ~life_expectancy, ~poverty, ~household_income,
"New Haven", 78.0580437642378, 0.264221051111753, 42588.7592521085
)
В своем воображении я мог бы сделать что-то вроде этого:
df %>%
mutate_at(vars(life_expectancy, poverty, household_income),
round, digits = c(1, 2, 0))
Но получите ошибку
Ошибка в mutate_impl (.data, точки):
Столбец life_expectancy
должен иметь длину 1 (количество строк), а не 3
Использование mutate_at
вместо mutate
только для того, чтобы иметь тот же синтаксис, что и в моем идеальном случае:
df %>%
mutate_at(vars(life_expectancy), round, digits = 1) %>%
mutate_at(vars(poverty), round, digits = 2) %>%
mutate_at(vars(household_income), round, digits = 0)
#> # A tibble: 1 x 4
#> name life_expectancy poverty household_income
#> <chr> <dbl> <dbl> <dbl>
#> 1 New Haven 78.1 0.26 42589
При отображении цифр используется каждая из опций digits
для каждого столбца , а не по позиции, что дает мне 3 строки, каждая из которых округляется до разного количества цифр.
df %>%
mutate_at(vars(life_expectancy, poverty, household_income),
function(x) map(x, round, digits = c(1, 2, 0))) %>%
unnest()
#> # A tibble: 3 x 4
#> name life_expectancy poverty household_income
#> <chr> <dbl> <dbl> <dbl>
#> 1 New Haven 78.1 0.3 42589.
#> 2 New Haven 78.1 0.26 42589.
#> 3 New Haven 78 0 42589
Создано в 2018-11-13 пакетом Представ (v0.2.1)