在之前通过 enquos 传递的每个变量上部署 arrange(desc(.))

Deploying arrange(desc(.)) on each variable passed previously via enquos

背景

使用 rlang I've a simple summary function for dplyr 计算每个提供的组的变量中缺失的观察值的数量。 我想 return 以 降序 顺序对变量进行分组。

示例数据

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 传递的变量。 IE。如果在 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))
}

您可以这样使用 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)