I want to map a function to generate summary statistics across a defined vector of columns. When I run the function alone it works fine, but when I map it I'm getting a non-numeric argument to mathematical function
error.
Here's the function
sumtab_ce_dt_ow_test <- function (df, depvar, treatvar)
{
require(dplyr, kableExtra)
df %>% dplyr::ungroup() %>%
mutate({{depvar}} := as.numeric({{depvar}})) %>%
dplyr::filter(!is.na({{depvar}})) %>%
group_by({{treatvar}}) %>%
dplyr::summarize(
N = n(),
Med = round(median({{depvar}}, na.rm = T), 2)
) %>%
arrange({{treatvar}})
}
Some sample data:
my_tibble <- tibble(
rownumber = 1:100,
a = sample(1:5, 100, replace = TRUE),
b = sample(1:5, 100, replace = TRUE),
c = sample(1:5, 100, replace = TRUE),
phase = sample(c("before", "after"), 100, replace = TRUE),
) %>%
mutate(
across(
c(a, b, c),
factor,
levels = 1:5,
labels = c("Strongly agree", "Agree", "Neutral", "Disagree", "Strongly disagree")
)
)
The simple running of the function works as desired
my_tibble %>% sumtab_ce_dt_ow_test(depvar = a, treatvar = phase)
my_tibble %>% sumtab_ce_dt_ow_test(depvar = b, treatvar = phase)
my_tibble %>% sumtab_ce_dt_ow_test(depvar = c, treatvar = phase)
But when I try to map it I get:
library(rlang)
response_texts <- c("Name 1", "name 2", "blah")
depvars <- c("a", "b", "c")
my_tibble <- my_tibble %>% mutate(across(all_of(depvars), ~ as.numeric(.x)))
results <- map2_df(depvars, response_texts, function(depvar, response_text) {
depvar <- enquo(depvar)
my_tibble %>%
sumtab_ce_dt_ow_test(depvar = !!depvar, treatvar = phase) %>%
mutate(response = response_text)
})
This throws
Error in `dplyr::summarize()`:
! Problem while computing `Med = round(median("a", na.rm = T), 2)`.
ℹ The error occurred in group 1: phase = "after".
Caused by error in `round()`:
! non-numeric argument to mathematical function
Backtrace:
1. purrr::map2_df(...)
10. dplyr:::summarise.grouped_df(...)
11. dplyr:::summarise_cols(.data, dplyr_quosures(...), caller_env = caller_env())
13. dplyr:::map(quosures, summarise_eval_one, mask = mask)
14. base::lapply(.x, .f, ...)
15. dplyr (local) FUN(X[[i]], ...)
16. mask$eval_all_summarise(quo)
Called from: signal_abort(cnd, .file)
Warning message:
Problem while computing `a = as.numeric("a")`.
ℹ NAs introduced by coercion
I've tried a few varieties of syntax for this, but I'm always getting this error. I'm sure I'm overlooking something obvious here?
Note that
"a"
anda
are two very different things in R. The first is a character value, the latter is a symbols. Usedepvar <- ensym(depvar)
to turn your character value into a symbol rather thanenquo