@@ -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*\u 00b1 \\ 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*) \u 00b1.+\\ [(\\ 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 , " (?<=\u 00b1 )\\ 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 | >
0 commit comments