Search code examples
rmedian

How to display median with compareGroups package?


I have this code:

data("ToothGrowth")
res<-compareGroups(supp~len, data = ToothGrowth)
restab<-createTable(res, show.p.overall = FALSE, extra.labels=c("","",""))
print(restab, which.table = "descr")

It gives me this output (with mean and standard deviation):

--------Summary descriptives table by 'supp'---------

______________________________________ 
                   OJ          VC      
                  N=30        N=30     
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 
len, Mean (SD) 20.7 (6.61) 17.0 (8.27) 
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 

Question: How to make it also output median? I need by group summary in html format of mean median and standard deviation.


Solution

  • Would you consider a solution with dplyr rather than compareGroups? You can add any statistic you want.

    library(dplyr)
    
    data("ToothGrowth")
    
    df<-ToothGrowth %>%
      group_by(supp) %>%
      summarize(mean = mean(len), 
                median = median(len),
                sd = sd(len),
                count = n())
    
    df
    
    # # A tibble: 2 x 5
    # supp   mean median    sd count
    # <fct> <dbl>  <dbl> <dbl> <int>
    # 1 OJ     20.7   22.7  6.61    30
    # 2 VC     17.0   16.5  8.27    30
    

    You can format the result (or any dataframe) as an HTML table with the package knitr. You'll find formatting options in the kable help file; the add-on package kableExtra lets you do a lot more.

    knitr::kable(df, format = "html", digits = 2)
    
    # <table>
    #   <thead>
    #   <tr>
    #   <th style="text-align:left;"> supp </th>
    #   <th style="text-align:right;"> mean </th>
    #   <th style="text-align:right;"> median </th>
    #   <th style="text-align:right;"> sd </th>
    #   <th style="text-align:right;"> count </th>
    #   </tr>
    #   </thead>
    #   <tbody>
    #   <tr>
    #   <td style="text-align:left;"> OJ </td>
    #   <td style="text-align:right;"> 20.66333 </td>
    #   <td style="text-align:right;"> 22.7 </td>
    #   <td style="text-align:right;"> 6.605561 </td>
    #   <td style="text-align:right;"> 30 </td>
    #   </tr>
    #   <tr>
    #   <td style="text-align:left;"> VC </td>
    #   <td style="text-align:right;"> 16.96333 </td>
    #   <td style="text-align:right;"> 16.5 </td>
    #   <td style="text-align:right;"> 8.266029 </td>
    #   <td style="text-align:right;"> 30 </td>
    #   </tr>
    #   </tbody>
    #   </table>
    #   > kable(df, format = "html", digits = 2)
    # <table>
    #   <thead>
    #   <tr>
    #   <th style="text-align:left;"> supp </th>
    #   <th style="text-align:right;"> mean </th>
    #   <th style="text-align:right;"> median </th>
    #   <th style="text-align:right;"> sd </th>
    #   <th style="text-align:right;"> count </th>
    #   </tr>
    #   </thead>
    #   <tbody>
    #   <tr>
    #   <td style="text-align:left;"> OJ </td>
    #   <td style="text-align:right;"> 20.66 </td>
    #   <td style="text-align:right;"> 22.7 </td>
    #   <td style="text-align:right;"> 6.61 </td>
    #   <td style="text-align:right;"> 30 </td>
    #   </tr>
    #   <tr>
    #   <td style="text-align:left;"> VC </td>
    #   <td style="text-align:right;"> 16.96 </td>
    #   <td style="text-align:right;"> 16.5 </td>
    #   <td style="text-align:right;"> 8.27 </td>
    #   <td style="text-align:right;"> 30 </td>
    #   </tr>
    #   </tbody>
    #   </table>