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 3192En krysstabell lages slik:
table(rhc$sex, rhc$death) No Yes
Female 919 1624
Male 1094 2098Merk 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 455Tabellering 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.5Argumentet 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.213949433Deretter 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 661Med 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
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()
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()
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()
Figuren er forkortet.