Tabellering

I dette kapitlet brukes data fra Right Heart Catetherization (RHC) for å demonstrere funksjoner for å tabellere data. Du kan laste ned dataene med følgende kommando:

rhc <- read.csv("https://hbiostat.org/data/repo/rhc.csv", header = TRUE)

Funksjoner i base R

Base R er grunninstallasjonen uten noen tilleggspakker. Den mest brukte funksjonen for tabeller i base R er table().

En enkelt kategorisk variabel kan tabelleres med funksjonen table():

table(rhc$sex)
Female   Male
  2543   3192

En krysstabell lages slik:

table(rhc$sex, rhc$death)
           No  Yes
  Female  919 1624
  Male   1094 2098

Merk at det første argumentet (sex) havner som rader og det andre argumentet (death) blir kolonner i krysstabellen.

Vi kan lage en krysstabell stratifisert på en tredje variabel. For å stratifisere den forrige tabellen på variabelen ca (kreft) skriver vi slik:

table(rhc$sex, rhc$death, rhc$ca)
ca = Metastatic

           No  Yes
  Female   24  175
  Male     12  173

ca = No

           No  Yes
  Female  798 1151
  Male    960 1470

ca = Yes

           No  Yes
  Female   97  298
  Male    122  455

Tabellering med tilleggspakker

Pakkene janitor, dplyr, gtsummary, crosstable og rstatix inneholder kraftige funksjoner for å lage deskriptive tabeller. Installer pakkene med følgende kommando:

install.packages(c("rstatix", "janitor", "gtsummary", "crosstable"))

Rstatix

Med funksjonen get_summary_stats() genererer vi deskriptive data for utvalgte variabler. I eksemplet nedenfor velger vi variablene age, aps1, urin1, adld3p, paco21 og ph1:

library(rstatix)
rhc %>%
  get_summary_stats(
    age, aps1, urin1, adld3p, paco21, ph1,
    type = "full")
## A tibble: 6 × 13
variable  n     min  max  median q1      q3      iqr     mad      mean    sd    se     ci
adld3p    1439  0    7    0      0       2       2       0        1.18    1.82  0.048  0.094
age       5735 18.0  102. 64.0   50.1    73.9    23.8    17.0     61.4    16.7  0.22   0.432
aps1      5735  3    147  54     41      67      26      19.3     54.7    20.0  0.264  0.517
paco21    5735  1    156  37     31      42      11      8.90     38.7    13.2  0.174  0.341
ph1       5735  6.58 7.77 7.4    7.34    7.46    0.12    0.089    7.39    0.11  0.001  0.003
urin1     2707  0    9000 1927   1110    2955    1845    1357.    2192.   1525. 29.3   57.5

Argumentet type er ovenfor spesifisert til type="full", noe som gir parameterne ovenfor. Argumentet har følgende alternativer: "full", "common", "robust", "five_number", "mean_sd", "mean_se", "mean_ci", "median_iqr", "median_mad", "quantile", "mean", "median", "min", "max".

Janitor

Med janitor kan man lage fleksible tabeller. Vi begynner med en beskrivelse av variabelen cat1 (sykdomskategori):

library(janitor)

rhc %>% tabyl(cat1, show_na = T)
              cat1    n     percent
               ARF 2490 0.434176112
               CHF  456 0.079511770
         Cirrhosis  224 0.039058413
      Colon Cancer    7 0.001220575
              Coma  436 0.076024412
              COPD  457 0.079686138
       Lung Cancer   39 0.006800349
 MOSF w/Malignancy  399 0.069572799
     MOSF w/Sepsis 1227 0.213949433

Deretter legger vi til variabelen sex, noe som gir en krysstabell:

rhc %>% tabyl(cat1, sex, show_na = T)
              cat1 Female Male
               ARF   1108 1382
               CHF    143  313
         Cirrhosis     81  143
      Colon Cancer      5    2
              Coma    230  206
              COPD    208  249
       Lung Cancer     12   27
 MOSF w/Malignancy    190  209
     MOSF w/Sepsis    566  661

Med janitors "adorn"-funksjoner kan vi legge til ytterligere informasjon i tabellene. Adorn-funksjoner kan kombineres. De er som følger:

Funksjonens navn Funksjon
adorn_totals() Legger til total. Har argumentet where = som kan være “row”, “col” eller “both”.
adorn_percentages() Konverterer antall til andeler. Har argumentet denominator = “row”, “col” eller “all”.
adorn_pct_formatting() Konverterer andeler til prosent.
adorn_rounding() Avrunder desimalene i andeler.
adorn_ns() Legger til antall i en tabell med andeler eller prosent.
adorn_title() Legger til en overskrift på radene og kolonnene i krysstabellen.

Vi lager en krysstabell med prosenttall:

rhc %>%
  tabyl(cat1, sex, show_na = T) %>%
  adorn_totals(where="col") %>%
  adorn_totals(where="row") %>%
  adorn_percentages() %>%
  adorn_pct_formatting()
              cat1 Female  Male  Total
               ARF  44.5% 55.5% 100.0%
               CHF  31.4% 68.6% 100.0%
         Cirrhosis  36.2% 63.8% 100.0%
      Colon Cancer  71.4% 28.6% 100.0%
              Coma  52.8% 47.2% 100.0%
              COPD  45.5% 54.5% 100.0%
       Lung Cancer  30.8% 69.2% 100.0%
 MOSF w/Malignancy  47.6% 52.4% 100.0%
     MOSF w/Sepsis  46.1% 53.9% 100.0%
             Total  44.3% 55.7% 100.0%

Vi legger nå til antallet i tillegg til prosenttallene:

rhc %>%
  tabyl(cat1, sex) %>%
  adorn_totals(where = "row") %>%
  adorn_percentages(denominator = "col") %>%
  adorn_pct_formatting() %>%
  adorn_ns(position = "front") %>%
  adorn_title(
    row_name = "Sjukdom",
    col_name = "Kön")
                             Kön
           Sjukdom        Female          Male
               ARF 1108  (43.6%) 1382  (43.3%)
               CHF  143   (5.6%)  313   (9.8%)
         Cirrhosis   81   (3.2%)  143   (4.5%)
      Colon Cancer    5   (0.2%)    2   (0.1%)
              Coma  230   (9.0%)  206   (6.5%)
              COPD  208   (8.2%)  249   (7.8%)
       Lung Cancer   12   (0.5%)   27   (0.8%)
 MOSF w/Malignancy  190   (7.5%)  209   (6.5%)
     MOSF w/Sepsis  566  (22.3%)  661  (20.7%)
             Total 2543 (100.0%) 3192 (100.0%)

Du kan lagre tabellen direkte til Microsoft Word, PowerPoint, HTML eller som et bilde ved hjelp av pakken flextable, hvis funksjoner kan brukes direkte som i følgende eksempel. Funksjonen save_as_docx() lagrer tabellen til Microsoft Word. Alternativt kan funksjonene save_as_html(), save_as_word(), save_as_ppt() eller save_as_image() brukes.

install.packages("flextable")
library(flextable)

rhc %>%
  tabyl(cat1, sex) %>%
  adorn_totals(where = "row") %>%
  adorn_percentages(denominator = "col") %>%
  adorn_pct_formatting() %>%
  adorn_ns(position = "front") %>%
  flextable() %>% # lager en flextable
  autofit() %>% # Sikrer maks 1 rad per celle
  save_as_docx(path="min_tabell.docx") # Lagrer i Word-format
Krysstabell fra janitor eksportert til Microsoft Word: diagnosekategorier (cat1) mot kjønn med antall og kolonneprosent samt totalrad

Crosstable

library(crosstable)

Vi lager nå en krysstabell for sex og death. Vi spesifiserer en egen funksjon for percent_pattern (denne trenger du ikke huske):

crosstable(data=rhc,
           # Variabler som skal krysstabelleres
           cols=c(age, sex),
           # Hvilke prosentandeler skal vises?
           total = "both",
           # Hvordan skal prosentandelene vises?
           percent_pattern="{n} ({p_row}/{p_col})") %>%
       # Penere formatering
       as_flextable()
Crosstable-tabell uten by-argument: alder (min/maks, median, gjennomsnitt, N) og kjønn med antall og prosent

Som du ser, ga ikke funksjonen noen krysstabell. Det skyldes at vi glemte argumentet by, noe vi retter opp nå:

crosstable(rhc,
           cols=c(age, sex),
           by=death,
           total = "both",
           percent_pattern="{n} ({p_row}/{p_col})") %>%
  as_flextable()
Crosstable-krysstabell av alder og kjønn stratifisert på death (No/Yes) med totalkolonne, antall og rad- og kolonneprosent

Funksjonen kan brukes til å inspisere alle variablene stratifisert på for eksempel death. For å inspisere alle variabler spesifiseres cols=everything():

crosstable(rhc,
           cols=everything(),
           by=death,
           total = "both",
           percent_pattern="{n} ({p_row}/{p_col})") %>%
  as_flextable()
Forkortet crosstable-tabell over alle variabler i RHC-dataene stratifisert på death, med deskriptiv statistikk per variabel

Figuren er forkortet.