R expss package: format numbers by statistic / apply different format to alternate rows

974 Views Asked by At

I'm exploring the expss package in order to change SPSS completely for R. My standard tabels show counts and percentages in the rows, sometimes also complemented with additional statistics.

Is there a way to change the number format by statistic or row? More concrete I would like to show the counts with 0 digits, percentages with 2 digits and ideally in % format and the means with 2 digits.

I searched in htmlTables and htmlTable.etable {expss} but am not able to find a way to do this.

Tx for all help

Hi Gregory,

Tx for your interest. See below small example.

Table as is

Table I'd like to see

Tx, micha

1

There are 1 best solutions below

0
On

Tables are usual data.frames so we can easily apply standard R formatting functions. Example:

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


# custom formating function
custom_format = function(tbl, percent_digits = 2, count_digits = 0){
    percent_rows = grepl("\\|%$", tbl[[1]], perl = TRUE) # get rows with percent format
    count_rows = grepl("\\|N$", tbl[[1]], perl = TRUE) # get rows with count format
    # format each stat
    rounded_percent = format(tbl[percent_rows,-1], digits = percent_digits, nsmall = percent_digits) 
    rounded_count = format(tbl[count_rows,-1], digits = count_digits, nsmall = count_digits)
    # replcae data in orginal tables with formatted stat
    tbl[percent_rows,-1] = rounded_percent
    tbl[count_rows,-1] = rounded_count
    ##### remove NA which arise during formatting
    recode(tbl) = perl("^\\s*NA\\s*$") ~ ""
    tbl
}


## example
expss_output_viewer()
mtcars %>% 
    tab_cells(gear) %>% 
    tab_cols(total(), am) %>% 
    tab_stat_cases(label = "N", total_row_position = "above") %>% 
    tab_stat_cpct(label = "%", total_row_position = "none") %>% 
    tab_pivot(stat_position = "inside_rows") %>% 
    custom_format()

enter image description here