Introduction

First, we apply labels on the well-known mtcars dataset:

library(expss)
data(mtcars)
mtcars = apply_labels(mtcars,
                      mpg = "Miles/(US) gallon",
                      cyl = "Number of cylinders",
                      disp = "Displacement (cu.in.)",
                      hp = "Gross horsepower",
                      drat = "Rear axle ratio",
                      wt = "Weight (1000 lbs)",
                      qsec = "1/4 mile time",
                      vs = "Engine",
                      vs = c("V-engine" = 0,
                             "Straight engine" = 1),
                      am = "Transmission",
                      am = c("Automatic" = 0,
                             "Manual"=1),
                      gear = "Number of forward gears",
                      carb = "Number of carburetors"
)

Table construction consists of at least of three functions chained with magrittr pipe operator: %>%. At first we need to specify variables for which statistics will be computed with tab_cells. Secondary, we calculate statistics with one of tab_stat_* functions. And last, we finalize table creation with tab_pivot: dataset %>% tab_cells(variable) %>% tab_stat_cases() %>% tab_pivot(). We can split our statistics by columns with tab_cols or by rows with tab_rows. After that we can sort table with tab_sort_asc, drop empty rows/columns with drop_rc and transpose with tab_transpose. Generally, resulting table is just a data.frame so we can use arbitrary operations on it. Statistic is always calculated on the last cells, column/row variables, weight, missing values and subgroup. To define new cell/column/row variables we can call appropriate function one more time. tab_pivot defines how we combine different statistics and where statistic labels will appear - inside/outside rows/columns.

Simple column percent

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(vs) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Simple column percent")
Simple column percent
 Engine 
 V-engine   Straight engine 
 Number of cylinders 
   4  5.6 71.4
   6  16.7 28.6
   8  77.8
   #Total cases  18 14

Split by columns and rows

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(vs) %>% 
    tab_rows(am) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Split by columns and rows")
Split by columns and rows
   Engine 
   V-engine   Straight engine 
 Transmission 
   Automatic   Number of cylinders   4    42.9
    6    57.1
    8    100.0
    #Total cases    12 7
   Manual   Number of cylinders   4    16.7 100.0
    6    50.0
    8    33.3
    #Total cases    6 7

Multiple banners, table is sorted by total

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), vs, am) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_sort_desc() %>% 
    tab_caption("Multiple banners, table is sorted by total")
Multiple banners, table is sorted by total
 #Total     Engine     Transmission 
   V-engine   Straight engine     Automatic   Manual 
 Number of cylinders 
   8  43.8   77.8   63.2 15.4
   4  34.4   5.6 71.4   15.8 61.5
   6  21.9   16.7 28.6   21.1 23.1
   #Total cases  32   18 14   19 13

Nested banners

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), vs %nest% am) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Nested banners")
Nested banners
 #Total     Engine 
   V-engine     Straight engine 
   Transmission     Transmission 
   Automatic   Manual     Automatic   Manual 
 Number of cylinders 
   4  34.4   16.7   42.9 100
   6  21.9   50.0   57.1
   8  43.8   100 33.3  
   #Total cases  32   12 6   7 7

Multiple nested banners

mtcars %>% 
    tab_cells(carb) %>% 
    tab_cols(total(), list(cyl, vs) %nest% am) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Multiple nested banners")
Multiple nested banners
 #Total     Number of cylinders     Engine 
   4     6     8     V-engine     Straight engine 
   Transmission     Transmission     Transmission     Transmission     Transmission 
   Automatic   Manual     Automatic   Manual     Automatic   Manual     Automatic   Manual     Automatic   Manual 
 Number of carburetors 
   1  21.9   33.3 50   50       42.9 57.1
   2  31.2   66.7 50     33.3   33.3 16.7   28.6 42.9
   3  9.4       25.0   25.0  
   4  31.2     50 66.7   41.7 50   41.7 50.0   28.6
   6  3.1     33.3     16.7  
   8  3.1       50   16.7  
   #Total cases  32   3 8   4 3   12 2   12 6   7 7

Multiple variable and multiple summary statistics

mtcars %>% 
    tab_cells(mpg, disp, hp, wt, qsec) %>%
    tab_cols(total(), am) %>% 
    tab_stat_fun(Mean = w_mean, "Std. dev." = w_sd, "Valid N" = w_n) %>%
    tab_pivot() %>% 
    tab_caption("Multiple variable and multiple summary statistics")
Multiple variable and multiple summary statistics
 #Total     Transmission 
   Automatic   Manual 
 Miles/(US) gallon 
   Mean  20.1   17.1 24.4
   Std. dev.  6.0   3.8 6.2
   Valid N  32.0   19.0 13.0
 Displacement (cu.in.) 
   Mean  230.7   290.4 143.5
   Std. dev.  123.9   110.2 87.2
   Valid N  32.0   19.0 13.0
 Gross horsepower 
   Mean  146.7   160.3 126.8
   Std. dev.  68.6   53.9 84.1
   Valid N  32.0   19.0 13.0
 Weight (1000 lbs) 
   Mean  3.2   3.8 2.4
   Std. dev.  1.0   0.8 0.6
   Valid N  32.0   19.0 13.0
 1/4 mile time 
   Mean  17.8   18.2 17.4
   Std. dev.  1.8   1.8 1.8
   Valid N  32.0   19.0 13.0

Multiple variable and multiple summary statistics - statistic lables in columns

mtcars %>% 
    tab_cells(mpg, disp, hp, wt, qsec) %>%
    tab_cols(total(), am) %>% 
    tab_stat_fun(Mean = w_mean, "Valid N" = w_n, method = list) %>%
    tab_pivot() %>% 
    tab_caption("Multiple variable and multiple summary statistics - statistic lables in columns")
Multiple variable and multiple summary statistics - statistic lables in columns
 #Total     Transmission 
 Mean     Valid N     Automatic     Manual 
     Mean   Valid N     Mean   Valid N 
 Miles/(US) gallon  20.1   32   17.1 19   24.4 13
 Displacement (cu.in.)  230.7   32   290.4 19   143.5 13
 Gross horsepower  146.7   32   160.3 19   126.8 13
 Weight (1000 lbs)  3.2   32   3.8 19   2.4 13
 1/4 mile time  17.8   32   18.2 19   17.4 13

Filter dataset and exclude empty columns

mtcars %>% 
    tab_subgroup(am == 0) %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), vs %nest% am) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    drop_empty_columns() %>%
    tab_caption("Filter dataset and exclude empty columns")
Filter dataset and exclude empty columns
 #Total     Engine 
   V-engine     Straight engine 
   Transmission     Transmission 
   Automatic     Automatic 
 Number of cylinders 
   4  15.8     42.9
   6  21.1     57.1
   8  63.2   100  
   #Total cases  19   12   7

Total at the top of the table

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), vs) %>% 
    tab_rows(am) %>% 
    tab_stat_cpct(total_row_position = "above",
                  total_label = c("number of cases", "row %"),
                  total_statistic = c("u_cases", "u_rpct")) %>% 
    tab_pivot() %>% 
    tab_caption("Total at the top of the table")
Total at the top of the table
   #Total     Engine 
     V-engine   Straight engine 
 Transmission 
   Automatic   Number of cylinders   #number of cases    19   12 7
    #row %    100   63.2 36.8
    4    15.8   42.9
    6    21.1   57.1
    8    63.2   100.0
   Manual   Number of cylinders   #number of cases    13   6 7
    #row %    100   46.2 53.8
    4    61.5   16.7 100.0
    6    23.1   50.0
    8    15.4   33.3

Three different statistics in each cell - stat. labels in rows

mtcars %>%
    tab_cells(am) %>%
    tab_cols(total(), vs) %>%
    tab_total_row_position("none") %>% 
    tab_stat_cpct(label = "col %") %>%
    tab_stat_rpct(label = "row %") %>%
    tab_stat_tpct(label = "table %") %>%
    tab_pivot(stat_position = "inside_rows") %>% 
    tab_caption("Three different statistics in each cell - stat. labels in rows")
Three different statistics in each cell - stat. labels in rows
   #Total     Engine 
     V-engine   Straight engine 
 Transmission 
   Automatic   col %    59.4   66.7 50.0
    row %    100.0   63.2 36.8
    table %    59.4   37.5 21.9
   Manual   col %    40.6   33.3 50.0
    row %    100.0   46.2 53.8
    table %    40.6   18.8 21.9

Three different statistics in each cell - stat. labels in columns

mtcars %>%
    tab_cells(am) %>%
    tab_cols(total(), vs) %>%
    tab_total_row_position("none") %>% 
    tab_stat_cpct(label = "col %") %>%
    tab_stat_rpct(label = "row %") %>%
    tab_stat_tpct(label = "table %") %>%
    tab_pivot(stat_position = "inside_columns") %>% 
    tab_caption("Three different statistics in each cell - stat. labels in columns")
Three different statistics in each cell - stat. labels in columns
 #Total     Engine 
 col %     row %     table %     V-engine     Straight engine 
       col %   row %   table %     col %   row %   table % 
 Transmission 
   Automatic  59.4   100   59.4   66.7 63.2 37.5   50 36.8 21.9
   Manual  40.6   100   40.6   33.3 46.2 18.8   50 53.8 21.9

Stacked statistics

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), am) %>% 
    tab_stat_mean() %>%
    tab_stat_se() %>% 
    tab_stat_valid_n() %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Stacked statistics")
Stacked statistics
 #Total     Transmission 
   Automatic   Manual 
 Number of cylinders 
   Mean  6.2   6.9 5.1
   S. E.  0.3   0.4 0.4
   Valid N  32.0   19.0 13.0
   4  34.4   15.8 61.5
   6  21.9   21.1 23.1
   8  43.8   63.2 15.4
   #Total cases  32   19 13

Stacked statistics with section headings

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), am) %>% 
    tab_row_label("#Summary statistics") %>% 
    tab_stat_mean() %>%
    tab_stat_se() %>% 
    tab_stat_valid_n() %>% 
    tab_row_label("#Column percent") %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Stacked statistics with section headings")
Stacked statistics with section headings
 #Total     Transmission 
   Automatic   Manual 
 #Summary statistics 
    
 Number of cylinders 
   Mean  6.2   6.9 5.1
   S. E.  0.3   0.4 0.4
   Valid N  32.0   19.0 13.0
 #Column percent 
    
 Number of cylinders 
   4  34.4   15.8 61.5
   6  21.9   21.1 23.1
   8  43.8   63.2 15.4
   #Total cases  32   19 13

Stacked statistics - different statistics for different variables

mtcars %>% 
    tab_cols(total(), am) %>% 
    tab_cells(mpg, hp, qsec) %>% 
    tab_stat_mean() %>%
    tab_cells(cyl, carb) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    tab_caption("Stacked statistics - different statistics for different variables")
Stacked statistics - different statistics for different variables
 #Total     Transmission 
   Automatic   Manual 
 Miles/(US) gallon 
   Mean  20.1   17.1 24.4
 Gross horsepower 
   Mean  146.7   160.3 126.8
 1/4 mile time 
   Mean  17.8   18.2 17.4
 Number of cylinders 
   4  34.4   15.8 61.5
   6  21.9   21.1 23.1
   8  43.8   63.2 15.4
   #Total cases  32   19 13
 Number of carburetors 
   1  21.9   15.8 30.8
   2  31.2   31.6 30.8
   3  9.4   15.8
   4  31.2   36.8 23.1
   6  3.1   7.7
   8  3.1   7.7
   #Total cases  32   19 13

Linear regression by groups

mtcars %>% 
    tab_cells(sheet(mpg, disp, hp, wt, qsec)) %>% 
    tab_cols(total(), am) %>% 
    tab_stat_fun_df(
        function(x){
            frm = reformulate(".", response = as.name(names(x)[1]))
            model = lm(frm, data = x)
            sheet('Coef.' = coef(model), 
                  confint(model)
            )
        }    
    ) %>% 
    tab_pivot() %>% 
    tab_caption("Linear regression by groups")
Linear regression by groups
 #Total     Transmission 
 Coef.     2.5 %     97.5 %     Automatic     Manual 
       Coef.   2.5 %   97.5 %     Coef.   2.5 %   97.5 % 
 (Intercept)  27.3   9.6   45.1   21.8 -1.9 45.5   13.3 -21.9 48.4
 Displacement (cu.in.)  0.0   0.0   0.0   0.0 0.0 0.0   0.0 -0.1 0.1
 Gross horsepower  0.0   -0.1   0.0   0.0 -0.1 0.0   0.0 0.0 0.1
 Weight (1000 lbs)  -4.6   -7.2   -2.0   -2.3 -5.0 0.4   -7.7 -12.5 -2.9
 1/4 mile time  0.5   -0.4   1.5   0.4 -0.7 1.6   1.6 -0.2 3.4

Subtotals

mtcars %>% 
    tab_cells(mpg) %>% 
    tab_cols(total(), vs) %>% 
    tab_rows(subtotal(cyl, 1:2, 3:4, "5 and more" = 5 %thru% hi)) %>% 
    tab_stat_mean() %>% 
    tab_pivot() %>% 
    tab_caption("Subtotals in rows")
Subtotals in rows
   #Total     Engine 
     V-engine   Straight engine 
 Number of cylinders 
   1   Miles/(US) gallon   Mean     
   2   Miles/(US) gallon   Mean     
   TOTAL 1/2   Miles/(US) gallon   Mean     
   3   Miles/(US) gallon   Mean     
   4   Miles/(US) gallon   Mean    26.7   26.0 26.7
   TOTAL 3/4   Miles/(US) gallon   Mean    26.7   26.0 26.7
   6   Miles/(US) gallon   Mean    19.7   20.6 19.1
   8   Miles/(US) gallon   Mean    15.1   15.1
   5 and more   Miles/(US) gallon   Mean    16.6   16.1 19.1

Subtotals at the bottom of the table

mtcars %>% 
    tab_cells(mpg, qsec) %>% 
    tab_cols(total(), vs) %>% 
    tab_rows(subtotal(cyl, 1:2, 3:4, "TOTAL 5 and more" = 5 %thru% hi, position = "bottom")) %>% 
    tab_stat_mean() %>% 
    tab_pivot() %>% 
    tab_caption("Subtotals at the bottom of the table")
Subtotals at the bottom of the table
   #Total     Engine 
     V-engine   Straight engine 
 Number of cylinders 
   1   Miles/(US) gallon   Mean     
    1/4 mile time   Mean     
   2   Miles/(US) gallon   Mean     
    1/4 mile time   Mean     
   3   Miles/(US) gallon   Mean     
    1/4 mile time   Mean     
   4   Miles/(US) gallon   Mean    26.7   26.0 26.7
    1/4 mile time   Mean    19.1   16.7 19.4
   6   Miles/(US) gallon   Mean    19.7   20.6 19.1
    1/4 mile time   Mean    18.0   16.3 19.2
   8   Miles/(US) gallon   Mean    15.1   15.1
    1/4 mile time   Mean    16.8   16.8
   TOTAL 1/2   Miles/(US) gallon   Mean     
    1/4 mile time   Mean     
   TOTAL 3/4   Miles/(US) gallon   Mean    26.7   26.0 26.7
    1/4 mile time   Mean    19.1   16.7 19.4
   TOTAL 5 and more   Miles/(US) gallon   Mean    16.6   16.1 19.1
    1/4 mile time   Mean    17.2   16.7 19.2

Nets

Net, contrary to subtotal, remove original categories.

mtcars %>% 
    tab_cells(mpg) %>% 
    tab_cols(total(), vs) %>% 
    tab_rows(net(cyl, 1:2, 3:4, "NET 5 and more" = 5 %thru% hi, prefix = "NET ")) %>% 
    tab_stat_mean() %>% 
    tab_pivot() %>% 
    tab_caption("Nets in rows, custom prefix")
Nets in rows, custom prefix
   #Total     Engine 
     V-engine   Straight engine 
 Number of cylinders 
   NET 1/2   Miles/(US) gallon   Mean     
   NET 3/4   Miles/(US) gallon   Mean    26.7   26.0 26.7
   NET 5 and more   Miles/(US) gallon   Mean    16.6   16.1 19.1

Nets with complex grouping

mtcars %>% 
    tab_cells(net(mpg, "Low mpg" = less(mean(mpg)), "High mpg" = greater_or_equal(mean(mpg)))) %>% 
    tab_cols(total(), am) %>% 
    tab_stat_cases() %>% 
    tab_pivot() %>% 
    tab_caption("Nets with complex grouping")
Nets with complex grouping
 #Total     Transmission 
   Automatic   Manual 
 Miles/(US) gallon 
   Low mpg  18   15 3
   High mpg  14   4 10
   #Total cases  32   19 13

Significance testing on column percent

Letters marks cells which are significantly greater than cells in the appropriate columns. - and + marks values which are lower/greater than values in the first column. Significance testing on column percent should be applied on the result of tab_stat_cpct with total row.

mtcars %>% 
    tab_cells(cyl) %>% 
    tab_cols(total(), vs) %>% 
    tab_stat_cpct() %>% 
    tab_pivot() %>% 
    significance_cpct(compare_type = c("first_column", "subtable"), sig_level = 0.05) %>% 
    tab_caption("Significance testing on column percent")
Significance testing on column percent
 #Total     Engine 
   V-engine     Straight engine 
   A     B 
 Number of cylinders 
   4  34.4    5.6 -   71.4 + A
   6  21.9    16.7     28.6  
   8  43.8    77.8 +  
   #Total cases  32    18     14  

Significance testing on means

Significance testing on means should be applied on the result of tab_stat_mean_sd_n.

mtcars %>% 
    tab_cells(mpg, disp, hp, wt, qsec) %>%
    tab_cols(total(), am) %>% 
    tab_stat_mean_sd_n() %>%
    tab_pivot() %>% 
    significance_means(compare_type = c("first_column", "subtable")) %>% 
    tab_caption("Significance testing on means")
Significance testing on means
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Miles/(US) gallon 
   Mean  20.1    17.1 -     24.4 + A
   Std. dev.  6.0    3.8     6.2  
   Unw. valid N  32.0    19.0     13.0  
 Displacement (cu.in.) 
   Mean  230.7    290.4 B     143.5 -  
   Std. dev.  123.9    110.2     87.2  
   Unw. valid N  32.0    19.0     13.0  
 Gross horsepower 
   Mean  146.7    160.3     126.8  
   Std. dev.  68.6    53.9     84.1  
   Unw. valid N  32.0    19.0     13.0  
 Weight (1000 lbs) 
   Mean  3.2    3.8 + B   2.4 -  
   Std. dev.  1.0    0.8     0.6  
   Unw. valid N  32.0    19.0     13.0  
 1/4 mile time 
   Mean  17.8    18.2     17.4  
   Std. dev.  1.8    1.8     1.8  
   Unw. valid N  32.0    19.0     13.0  

Multiple-response variables with weighting

Here we load data with multiple-responce questions. mrset means that we treat set of variables as multiple response varibale with category encoding. For dichotomy encoding use mdset.

data(product_test)
codeframe_likes = num_lab("
                          1 Liked everything
                          2 Disliked everything
                          3 Chocolate
                          4 Appearance
                          5 Taste
                          6 Stuffing
                          7 Nuts
                          8 Consistency
                          98 Other
                          99 Hard to answer
                          ")

set.seed(1)
product_test = product_test %>% 
    let( 
        # recode age by groups
        age_cat = recode(s2a, lo %thru% 25 ~ 1, lo %thru% hi ~ 2),
        wgt = runif(.N, 0.25, 4),
        wgt = wgt/sum(wgt)*.N
    )  %>% 
    apply_labels(
        age_cat = "Age",
        age_cat = c("18 - 25" = 1, "26 - 35" = 2),
        a1_1 = "Likes. VSX123",
        b1_1 = "Likes. SDF456",
        a1_1 = codeframe_likes,
        b1_1 = codeframe_likes
    )

product_test %>% 
    tab_cells(mrset(a1_1 %to% a1_6), mrset(b1_1 %to% b1_6)) %>% 
    tab_cols(total(), age_cat) %>% 
    tab_weight(wgt) %>% 
    tab_stat_cpct() %>% 
    tab_sort_desc() %>% 
    tab_pivot() %>% 
    tab_caption("Multiple-response variables with weighting")
Multiple-response variables with weighting
 #Total     Age 
   18 - 25   26 - 35 
 Likes. VSX123 
   Nuts  68.0   82.5 53.7
   Taste  39.3   48.4 30.3
   Chocolate  34.5   31.9 37.0
   Appearance  33.6   26.7 40.4
   Stuffing  31.5   23.6 39.3
   Consistency  12.9   7.7 18.0
   Disliked everything  0.7   1.4
   Liked everything   
   Other   
   Hard to answer   
   #Total cases  150   70 80
 Likes. SDF456 
   Nuts  63.3   62.1 64.4
   Taste  31.6   35.2 28.0
   Appearance  30.3   28.8 31.8
   Chocolate  27.2   27.9 26.4
   Stuffing  21.5   14.3 28.7
   Consistency  8.2   1.7 14.7
   Disliked everything  2.9   3.3 2.5
   Other  1.0   1.9
   Liked everything   
   Hard to answer   
   #Total cases  150   70 80

Side-by-side variables comparison

To make side-by-side comparison we use “|” to suppress variable labels and put these labels to the statistic labels. Statistics labels we place in columns with tab_pivot.

product_test %>% 
    tab_cols(total(), age_cat) %>% 
    tab_weight(wgt) %>% 
    # '|' is needed to prevent automatic labels creation from argument
    tab_cells("|" = unvr(mrset(a1_1 %to% a1_6))) %>% 
    tab_stat_cpct(label = var_lab(a1_1)) %>% 
    tab_cells("|" = unvr(mrset(b1_1 %to% b1_6))) %>% 
    tab_stat_cpct(label = var_lab(b1_1)) %>% 
    tab_pivot(stat_position = "inside_columns") %>% 
    tab_caption("Side-by-side variables comparison")
Side-by-side variables comparison
 #Total     Age 
 Likes. VSX123     Likes. SDF456     18 - 25     26 - 35 
     Likes. VSX123   Likes. SDF456     Likes. VSX123   Likes. SDF456 
 Liked everything       
 Disliked everything  0.7   2.9   3.3   1.4 2.5
 Chocolate  34.5   27.2   31.9 27.9   37.0 26.4
 Appearance  33.6   30.3   26.7 28.8   40.4 31.8
 Taste  39.3   31.6   48.4 35.2   30.3 28.0
 Stuffing  31.5   21.5   23.6 14.3   39.3 28.7
 Nuts  68.0   63.3   82.5 62.1   53.7 64.4
 Consistency  12.9   8.2   7.7 1.7   18.0 14.7
 Other    1.0     1.9
 Hard to answer       
 #Total cases  150   150   70 70   80 80

Multiple tables in the loop with knitr

To make the task more practical we will create table with means for variables which have more than 6 unique elements. For other variables we will calculate column percent table. Note that you need to set results='asis' in the chunk options.

# here we specify dataset and banner
banner = mtcars %>%
    tab_cols(total(), am)

for(each in colnames(mtcars)){
    # note ..$ which is used for indirect reference to variable
    # specify variable
    curr_table = banner %>% 
        tab_cells(..$each)
    # calculate statistics
    if(length(unique(mtcars[[each]]))>6){
        curr_table = curr_table %>% 
            tab_stat_mean_sd_n() %>% 
            tab_pivot() %>% 
            significance_means()
    } else {
        curr_table = curr_table %>% 
            tab_stat_cpct() %>% 
            tab_pivot() %>% 
            significance_cpct()
    }
    # finalize table
    curr_table %>% 
        tab_caption("Variable name: ", each) %>% 
        htmlTable() %>% 
        print()
}
Variable name: mpg
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Miles/(US) gallon 
   Mean  20.1    17.1    24.4 A
   Std. dev.  6.0    3.8    6.2  
   Unw. valid N  32.0    19.0    13.0  
Variable name: cyl
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Number of cylinders 
   4  34.4    15.8     61.5 A
   6  21.9    21.1     23.1  
   8  43.8    63.2 B   15.4  
   #Total cases  32    19     13  
Variable name: disp
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Displacement (cu.in.) 
   Mean  230.7    290.4 B   143.5 
   Std. dev.  123.9    110.2     87.2 
   Unw. valid N  32.0    19.0     13.0 
Variable name: hp
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Gross horsepower 
   Mean  146.7    160.3    126.8 
   Std. dev.  68.6    53.9    84.1 
   Unw. valid N  32.0    19.0    13.0 
Variable name: drat
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Rear axle ratio 
   Mean  3.6    3.3    4.0 A
   Std. dev.  0.5    0.4    0.4  
   Unw. valid N  32.0    19.0    13.0  
Variable name: wt
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Weight (1000 lbs) 
   Mean  3.2    3.8 B   2.4 
   Std. dev.  1.0    0.8     0.6 
   Unw. valid N  32.0    19.0     13.0 
Variable name: qsec
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 1/4 mile time 
   Mean  17.8    18.2    17.4 
   Std. dev.  1.8    1.8    1.8 
   Unw. valid N  32.0    19.0    13.0 
Variable name: vs
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Engine 
   V-engine  56.2    63.2    46.2 
   Straight engine  43.8    36.8    53.8 
   #Total cases  32    19    13 
Variable name: am
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Transmission 
   Automatic  59.4    100.0   
   Manual  40.6      100.0 
   #Total cases  32    19    13 
Variable name: gear
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Number of forward gears 
   3  46.9    78.9   
   4  37.5    21.1    61.5 A
   5  15.6      38.5  
   #Total cases  32    19    13  
Variable name: carb
 #Total     Transmission 
   Automatic     Manual 
   A     B 
 Number of carburetors 
   1  21.9    15.8    30.8 
   2  31.2    31.6    30.8 
   3  9.4    15.8   
   4  31.2    36.8    23.1 
   6  3.1      7.7 
   8  3.1      7.7 
   #Total cases  32    19    13