Skip to content

Commit fbf124c

Browse files
committed
compare2numvars reges now recognize floats
regex simplified with look-arounds
1 parent c295bcd commit fbf124c

File tree

9 files changed

+108
-67
lines changed

9 files changed

+108
-67
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ importFrom(DescTools,BinomRatioCI)
5858
importFrom(broom,tidy)
5959
importFrom(flextable,flextable_to_rmd)
6060
importFrom(forcats,fct_drop)
61+
importFrom(forcats,fct_inorder)
6162
importFrom(forcats,fct_lump_n)
6263
importFrom(grDevices,boxplot.stats)
6364
importFrom(lifecycle,deprecated)

R/descriptives.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ median_cl_boot_gg <- function(x){
317317
#' @param type type for function boot.ci.
318318
#' @param nrepl number of bootstrap replications, defaults to 1000.
319319
#' @param round logical, applies [roundR] function to results. Output is character.
320-
#' @param roundDig Number of relevant digits for functio [roundR].
320+
#' @param roundDig Number of relevant digits for function [roundR].
321321
#'
322322
#' @return A tibble with one row and three columns: Mean, CIlow, CIhigh.
323323
#'

R/tests.R

Lines changed: 62 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ t_var_test <- function(data, formula, cutoff = .05) {
405405
#' @param singleline Put all group levels in a single line (default) or below each other.
406406
#' @param indentor Optional text element to indent descriptivestats when using singleline = FALSE. Defaults to " ".
407407
#' @param ci Computes lower and upper confidence limits for the estimated mean/median, based on bootstrapping.
408+
#' @param n_boot Number of bootstrap samples for confidence limits.
408409
#'
409410
#' @return
410411
#' A tibble with variable names, descriptive statistics, and p-value,
@@ -416,6 +417,10 @@ t_var_test <- function(data, formula, cutoff = .05) {
416417
#' data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
417418
#' gaussian = TRUE
418419
#' )
420+
#' compare2numvars(
421+
#' data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
422+
#' gaussian = TRUE, singleline = FALSE
423+
#' )
419424
#' # Ordinal scale:
420425
#' compare2numvars(
421426
#' data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
@@ -432,13 +437,19 @@ compare2numvars <- function(data, dep_vars, indep_var,
432437
rangesep = " ",
433438
pretext = FALSE, mark = FALSE,
434439
n = FALSE, add_n = FALSE,
435-
singleline = TRUE, indentor = " ", ci = FALSE) {
440+
singleline = TRUE,
441+
indentor = " ",
442+
ci = FALSE,
443+
n_boot = 10^4) {
436444
`.` <- Group <- Value <- Variable <- desc_groups <- NULL
445+
if(!singleline){
446+
ci <- TRUE
447+
}
437448
if (gaussian) {
438449
DESC <- meansd
439450
COMP <- t_var_test
440-
DESC_CI <- mean_cl_boot
441-
string <- "(\\d+\\s*±\\s*\\d+)\\s*(\\[\\d+\\s*->\\s*\\d+\\])\\s*(\\[n=\\d+\\])\\s*(\\[\\d+\\s*;\\s*\\d+\\])"
451+
DESC_CI <- wrappedtools::mean_cl_boot
452+
string <- "(\\d+\\s*\u00b1\\s*\\d+)\\s*(\\[\\d+\\s*->\\s*\\d+\\])\\s*(\\[n=\\d+\\])\\s*(\\[\\d+\\s*;\\s*\\d+\\])"
442453
order <- "\\1 \\4 \\2 \\3"
443454
} else {
444455
DESC <- median_quart
@@ -459,17 +470,17 @@ compare2numvars <- function(data, dep_vars, indep_var,
459470
pivot_longer(-Group,names_to = 'Variable',values_to = 'Value') |>
460471
mutate(Variable = forcats::fct_inorder(Variable)) |>
461472
# na.omit() |>
462-
as_tibble()
473+
tibble::as_tibble()
463474

464475
if(nlevels(data_l$Group)!=2){
465476
stop(paste0('Other than 2 groups provided for ',indep_var,': ',
466477
paste(levels(data_l$Group),collapse='/'),
467478
". Look into function compare_n_numvars."))
468479
}
469480

470-
if (!singleline && n && !add_n){
481+
if(!singleline && n && !add_n){
471482
add_n = TRUE
472-
print(glue::glue("add_n will be set to TRUE to calculate n for long table format (singleline = FALSE)"))
483+
cat("add_n will be set to TRUE to calculate n for long table format (singleline = FALSE)\n")
473484
}
474485

475486
data_l <- data_l |>
@@ -483,16 +494,16 @@ compare2numvars <- function(data, dep_vars, indep_var,
483494
range = range,
484495
rangesep = rangesep,
485496
add_n = add_n),
486-
all_CI = DESC_CI(Value, round = TRUE) |>
487-
transmute(ci = paste0("[", CIlow, "; ", CIhigh, "]")) |>
497+
all_CI = DESC_CI(Value, round = TRUE, nrepl = n_boot, roundDig = round_desc) |>
498+
transmute(ci = paste0("[", .data$CIlow, "; ", .data$CIhigh, "]")) |>
488499
pull(ci),
489500
desc_groups = try(DESC(Value, groupvar = Group,
490501
roundDig = round_desc,
491502
range = range, rangesep =
492503
rangesep, add_n = add_n),
493504
silent = TRUE) |>
494505
paste(collapse = ":"),
495-
p = try(suppressWarnings(COMP(Value ~ Group, data = cur_data())$p.value),
506+
p = try(suppressWarnings(COMP(Value ~ Group, data = pick(everything()))$p.value),
496507
silent = TRUE) |>
497508
formatP(ndigits = round_p,
498509
pretext = pretext,
@@ -502,8 +513,8 @@ compare2numvars <- function(data, dep_vars, indep_var,
502513

503514
group_ci <- data_l |>
504515
group_by(Variable, Group) |>
505-
summarise(ci = DESC_CI(Value, round = TRUE) |>
506-
transmute(ci = paste0("[", CIlow, "; ", CIhigh, "]")) |>
516+
summarise(ci = DESC_CI(Value, round = TRUE, nrepl = n_boot, roundDig = round_desc) |>
517+
transmute(ci = paste0("[", .data$CIlow, "; ", .data$CIhigh, "]")) |>
507518
pull(ci),
508519
.groups = "drop") |>
509520
pivot_wider(names_from = Group, values_from = ci, names_prefix = "CI_")
@@ -521,16 +532,15 @@ compare2numvars <- function(data, dep_vars, indep_var,
521532
if (ci){
522533
out <- out |>
523534
mutate(
524-
desc_all = paste(desc_all, all_CI) |>
535+
desc_all = paste(.data$desc_all, .data$all_CI) |>
525536
str_replace(string, order),
526-
g1 = paste(g1, out[[10]]) |>
537+
g1 = paste(.data$g1, out[[10]]) |>
527538
str_replace(string, order),
528-
g2 = paste(g2, out[[11]]) |>
539+
g2 = paste(.data$g2, out[[11]]) |>
529540
str_replace(string, order)
530541
) |>
531542
dplyr::select(-contains("CI"))
532-
}
533-
else{
543+
} else{
534544
out <- out |>
535545
dplyr::select(-contains("CI"))
536546
}
@@ -543,44 +553,37 @@ compare2numvars <- function(data, dep_vars, indep_var,
543553
out_tmp <-
544554
out |>
545555
dplyr::select(-starts_with("n")) |>
546-
pivot_longer(cols = -c(Variable, p),
556+
pivot_longer(cols = -c("Variable", "p"),
547557
names_to = "group",
548558
values_to = "stats") |>
549559
mutate(
550-
n = str_extract(stats, "\\[n=\\d+\\]") |>
551-
str_extract("\\d+") |>
552-
as.character(),
560+
n = str_extract(.data$stats,
561+
pattern = "(?<=n=)\\d+"),
553562
"Mean (95% CI)" = if (gaussian) {
554-
paste0(str_extract(stats, "^\\d+")," (",
555-
str_extract(stats, "\\[\\d+; \\d+\\]") |>
556-
str_remove_all("[\\[\\]]") |>
557-
str_replace(";", "/"),
558-
")")
563+
str_replace(.data$stats,
564+
"^(\\d+[.,]*\\d*) \u00b1.+\\[(\\d+[.,]*\\d*); (\\d+[.,]*\\d*).*",
565+
"\\1 (\\2 / \\3)")
559566
} else {NA_character_},
560567
SD = if (gaussian) {
561-
str_extract(stats, "(\\d+)\\s*±\\s*(\\d+)") |>
562-
str_extract("\\d+$") |>
563-
as.character()}
564-
else {NA_character_},
568+
str_extract(.data$stats, "(?<=\u00b1 )\\d+[.,]*\\d*")
569+
} else {NA_character_},
565570
"Median (95% CI)" = if (!gaussian) {
566-
paste0(str_extract(stats, "^\\d+")," (",
567-
str_extract(stats, "\\[\\d+; \\d+\\]") |>
568-
str_remove_all("[\\[\\]]") |>
569-
str_replace(";", "/"),
570-
")")}
571-
else {NA_character_},
571+
str_replace(.data$stats,
572+
"^(\\d+[.,]*\\d*) \\(.+\\[(\\d+[.,]*\\d*); (\\d+[.,]*\\d*).*",
573+
"\\1 (\\2 / \\3)")
574+
} else {NA_character_},
572575
Quartiles = if (!gaussian) {
573-
str_extract(stats, "\\(\\d+/\\d+\\)") |>
576+
str_extract(.data$stats, "(?<=\\()(\\d+.*?)(?=\\))") |>
574577
str_remove_all("[\\(\\)]") |>
575578
as.character()
576579
} else {
577580
NA_character_},
578-
"min -> max" = str_extract(stats, "\\[\\d+\\s*->\\s*\\d+\\]") |>
581+
"min -> max" = str_extract(.data$stats, "(?<=\\[)\\d+[.,]*\\d* -> \\d+[.,]*\\d*(?=\\])") |>
579582
str_remove_all("[\\[\\]]")
580583
) |>
581-
select(-stats) |>
584+
select(-"stats") |>
582585
select_if(~ !any(is.na(.))) |>
583-
pivot_longer(-c(Variable, group, p),
586+
pivot_longer(-c("Variable", "group", "p"),
584587
names_to = "stats",
585588
values_to = "values") |>
586589
pivot_wider(names_from = "group",
@@ -599,26 +602,28 @@ compare2numvars <- function(data, dep_vars, indep_var,
599602
out <- out_tmp |>
600603
arrange(Variable) |>
601604
group_by(Variable) |>
602-
arrange(stats != "", .by_group = TRUE) |>
605+
arrange(.data$stats != "", .by_group = TRUE) |>
603606
ungroup() |>
604-
mutate(Variable = case_when(
605-
stats == "n" ~ paste0(indentor, "n"),
606-
stats == "Mean (95% CI)" ~ paste0(indentor, "Mean (95% CI)"),
607-
stats == "Median (95% CI)" ~ paste0(indentor, "Median (95% CI)"),
608-
stats == "Quartiles" ~ paste0(indentor, "Quartiles"),
609-
stats == "SD" ~ paste0(indentor, "SD"),
610-
stats == "min -> max" ~ paste0(indentor, "min -> max"),
611-
TRUE ~ Variable),
612-
p = case_when(
613-
stats == "Mean (95% CI)" ~ "",
614-
stats == "Median (95% CI)" ~ "",
615-
stats == "SD" ~ "",
616-
stats == "Quartiles" ~ "",
617-
stats == "min -> max" ~ "",
618-
stats == "n" ~ "",
619-
TRUE ~ p)
607+
mutate(Variable = case_match(
608+
.data$stats,
609+
"n" ~ paste0(indentor, "n"),
610+
"Mean (95% CI)" ~ paste0(indentor, "Mean (95% CI)"),
611+
"Median (95% CI)" ~ paste0(indentor, "Median (95% CI)"),
612+
"Quartiles" ~ paste0(indentor, "Quartiles"),
613+
"SD" ~ paste0(indentor, "SD"),
614+
"min -> max" ~ paste0(indentor, "min -> max"),
615+
.default = Variable),
616+
p = case_match(
617+
.data$stats,
618+
"Mean (95% CI)" ~ "",
619+
"Median (95% CI)" ~ "",
620+
"SD" ~ "",
621+
"Quartiles" ~ "",
622+
"min -> max" ~ "",
623+
"n" ~ "",
624+
.default = .data$p)
620625
) |>
621-
select(Variable, desc_all, g1, g2, p)
626+
select(Variable, "desc_all", "g1", "g2", "p")
622627
}
623628

624629
out <- out |>

man/compare2numvars.Rd

Lines changed: 10 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/mean_cl_boot.Rd

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/median_cl_boot.Rd

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/wrappedtools-package.Rd

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
138 Bytes
Binary file not shown.

tests/testthat/test-compare_2_numvars.R

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
# data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
44
# gaussian = TRUE
55
# )
6-
# # Ordinal scale:
6+
# # # Ordinal scale:
77
# out2 <- compare2numvars(
88
# data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
99
# gaussian = FALSE
1010
# )
11-
# saveRDS(list(out1=out1, out2=out2),file = 'tests/testthat/compare2numvars_out.rda')
11+
# out3 <- compare2numvars(
12+
# data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
13+
# gaussian = TRUE,singleline = FALSE, n_boot = 10^5,round_desc = 1
14+
# )
15+
# saveRDS(list(out1=out1, out2=out2, out3=out3),file = 'tests/testthat/compare2numvars_out.rda')
1216

1317

1418
test_that("compare2numvars() with defaults and options set, plus tests for errors", {
@@ -22,6 +26,11 @@ test_that("compare2numvars() with defaults and options set, plus tests for error
2226
gaussian = FALSE
2327
),
2428
expected[[2]])
29+
expect_equal(compare2numvars(
30+
data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = "am",
31+
gaussian = TRUE,singleline = FALSE, n_boot = 10^5, round_desc = 1
32+
),
33+
expected[[3]])
2534
expect_error(compare2numvars(
2635
data = mtcars, dep_vars = c("wt", "mpg", "qsec"), indep_var = c("am","cyl"),
2736
gaussian = FALSE

0 commit comments

Comments
 (0)