Я не уверен, есть ли прямой способ сделать это с чем-то вроде map
. Проблема, с которой вы сталкиваетесь, заключается в том, что при вызове map(df, *whatever_function*)
функция вызывается для каждого столбца df
как вектор, тогда как ваша функция ожидает пустое имя столбца в стиле tidyeval. Чтобы убедиться, что:
map(df, class)
вернет "numeric"
для каждого столбца.
Альтернативой является перебор имен столбцов в виде строк и преобразование их в символы; это займет всего одну дополнительную строку в функции.
library(dplyr)
library(tidyr)
library(purrr)
cnt_un_name <- function(varname) {
var <- ensym(varname)
df %>%
filter({{var}} == 1) %>%
group_by({{var}}) %>%
summarise(n_uniq = n_distinct(id)) %>%
ungroup()
}
Вызов функции немного неловкий, потому что он сохраняет только имена соответствующих столбцов (вызов "r_r1"
возвращает столбцы "r_r1"
и "n_uniq"
, и др c). Одним из способов является получение нужного вектора имен столбцов, присвойте ему имя, чтобы можно было добавить столбец идентификатора в map_dfr
и удалить дополнительные столбцы, поскольку они будут в основном NA
.
grep("^r_r\\d+", names(df), value = TRUE) %>%
set_names() %>%
map_dfr(cnt_un_name, .id = "y") %>%
select(y, n_uniq)
#> # A tibble: 3 x 2
#> y n_uniq
#> <chr> <int>
#> 1 r_r1 3
#> 2 r_r2 2
#> 3 r_r3 2
Лучший способ - вызвать функцию, а затем выполнить привязку после изменения формы.
grep("^r_r\\d+", names(df), value = TRUE) %>%
map(cnt_un_name) %>%
map_dfr(pivot_longer, 1, names_to = "y") %>%
select(y, n_uniq)
# same output as above
В качестве альтернативы (и, возможно, лучше / более масштабируемой) можно было бы сделать переименование столбца внутри определения функции.