Quantcast
Channel: Active questions tagged r - Stack Overflow
Viewing all articles
Browse latest Browse all 202041

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

$
0
0

Background

Using rlang I've a simple summary function for dplyr that counts a number of missing observations within a variable per provided groups. I would like to return the results in a descending order of grouping variables.

Sample data

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

Summary function

Working version

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)))
}

Desired results

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

Problem

Implementing arrange(desc(x)) call so it can handle each of the variables passed initially via enquos. I.e. if there are 5 grouping variables passed via in enquos this should be equivalent of arrange(desc(var1)) .... arrange(desc(var5)).

Attempt

Naturally, this doesn't work:

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))
}

Viewing all articles
Browse latest Browse all 202041

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>