Развертывание компоновки (des c (.)) Для каждой переменной, переданной ранее через enquos - PullRequest
0 голосов
/ 08 января 2020

Фон

Использование rlang У меня есть простая сводная функция для dplyr, которая подсчитывает количество пропущенных наблюдений в переменной для предоставленных групп , Я хотел бы вернуть результаты в порядке убывания группировки переменных.

Пример данных

library("tidyverse")
set.seed(123)
test_data <- tibble(dates = seq.Date(
    from = as.Date.character(x = "01-01-2000", format = "%d-%m-%Y"),
    to = as.Date.character(x = "31-12-2010", format = "%d-%m-%Y"),
    by = "day"
)) %>%
    transmute(
        t_year = lubridate::year(dates),
        t_mnth = lubridate::month(dates),
        t_day = lubridate::day(dates),
        tst_var = if_else(rnorm(n()) > .8, NA_real_, rnorm(n()))
    )

Сводная функция

Рабочая версия

quick_smry <- function(df, x, ...) {
    group_by_vars <- enquos(...)
    check_var <- enquo(x)
    df %>% 
        group_by(!!!group_by_vars) %>% 
        summarise(num_missing = sum(is.na(!!check_var)))
}

Желаемые результаты

test_data %>% 
    group_by(t_year, t_mnth) %>% 
    summarise(num_missing = sum(is.na(tst_var))) %>% 
    arrange(desc(t_year), desc(t_mnth))

Задача

Реализация arrange(desc(x)) вызова, чтобы он мог обрабатывать каждую переменных Первоначально прошло через enquos. Т.е. если в enquos передано 5 группирующих переменных, это должно быть эквивалентно arrange(desc(var1)) .... arrange(desc(var5)).

Попытка

Естественно, это не сработает:

quick_smry <- function(df, x, ...) {
    group_by_vars <- enquos(...)
    check_var <- enquo(x)
    df %>% 
        group_by(!!!group_by_vars) %>% 
        summarise(num_missing = sum(is.na(!!check_var))) %>%
        # Desc call should be created for each of the group variables
        arrange(desc(!!!group_by_vars))
}

1 Ответ

1 голос
/ 08 января 2020

Вы можете использовать arrange_at так:

quick_smry <- function(df, x, ...) {
    group_by_vars <- enquos(...)
    check_var <- enquo(x)
    df %>% 
        group_by(!!!group_by_vars) %>% 
        summarise(num_missing = sum(is.na(!!check_var))) %>%
        arrange_at(group_by_vars, desc)
}

quick_smry(test_data, tst_var, t_year, t_mnth)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...