Tabellierung

In diesem Kapitel werden Daten aus der Right Heart Catetherization (RHC) verwendet, um Funktionen zur Tabellierung von Daten zu demonstrieren. Sie können die Daten mit folgendem Befehl herunterladen:

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

Funktionen in Base R

Base R ist die Grundinstallation ohne zusätzliche Packages. Die am häufigsten verwendete Funktion für Tabellen in Base R ist table().

Eine einzelne kategoriale Variable lässt sich mit der Funktion table() tabellieren:

table(rhc$sex)
Female   Male
  2543   3192

Eine Kreuztabelle wird folgendermaßen erstellt:

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

Beachten Sie, dass das erste Argument (sex) die Zeilen und das zweite Argument (death) die Spalten der Kreuztabelle bildet.

Wir können eine Kreuztabelle nach einer dritten Variablen stratifizieren. Um die vorherige Tabelle nach der Variablen ca (Krebs) zu stratifizieren, schreiben wir Folgendes:

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

Tabellierung mit Zusatzpaketen

Die Packages janitor, dplyr, gtsummary, crosstable und rstatix enthalten leistungsfähige Funktionen zur Erstellung deskriptiver Tabellen. Installieren Sie die Packages mit folgendem Befehl:

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

Rstatix

Mit der Funktion get_summary_stats() erzeugen wir deskriptive Kennzahlen für ausgewählte Variablen. Im folgenden Beispiel wählen wir die Variablen age, aps1, urin1, adld3p, paco21 und 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

Das Argument type wurde oben als type="full" angegeben, was die obigen Parameter ergibt. Das Argument hat folgende Optionen: "full", "common", "robust", "five_number", "mean_sd", "mean_se", "mean_ci", "median_iqr", "median_mad", "quantile", "mean", "median", "min", "max".

Janitor

Mit janitor lassen sich flexible Tabellen erstellen. Wir beginnen mit einer Beschreibung der Variablen cat1 (Krankheitskategorie):

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

Anschließend fügen wir die Variable sex hinzu, wodurch eine Kreuztabelle entsteht:

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

Mit den „adorn“-Funktionen von janitor können wir den Tabellen zusätzliche Informationen hinzufügen. Adorn-Funktionen lassen sich kombinieren. Es handelt sich um folgende:

Name der Funktion Funktion
adorn_totals() Fügt eine Summe hinzu. Hat das Argument where =, das “row”, “col” oder “both” sein kann.
adorn_percentages() Wandelt Anzahlen in Anteile um. Hat das Argument denominator = “row”, “col” oder “all”.
adorn_pct_formatting() Wandelt Anteile in Prozent um.
adorn_rounding() Rundet die Dezimalstellen von Anteilen.
adorn_ns() Fügt einer Tabelle mit Anteilen oder Prozentangaben die Anzahlen hinzu.
adorn_title() Fügt den Zeilen und Spalten der Kreuztabelle eine Überschrift hinzu.

Wir erstellen eine Kreuztabelle mit Prozentangaben:

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%

Nun fügen wir zusätzlich zu den Prozentangaben die Anzahlen hinzu:

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

Mit dem Package flextable, dessen Funktionen wie im folgenden Beispiel direkt angewendet werden können, lässt sich die Tabelle direkt in Microsoft Word, PowerPoint, HTML oder als Bild speichern. Die Funktion save_as_docx() speichert die Tabelle in Microsoft Word. Alternativ können die Funktionen save_as_html(), save_as_word(), save_as_ppt() oder save_as_image() verwendet werden.

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() %>% # erstellt eine flextable
  autofit() %>% # Stellt maximal 1 Zeile pro Zelle sicher
  save_as_docx(path="min_tabell.docx") # Speichert im Word-Format
Mit janitor erstellte und nach Microsoft Word exportierte Kreuztabelle: Diagnosekategorien (cat1) nach Geschlecht mit Anzahlen, Spaltenprozenten und Summenzeile

Crosstable

library(crosstable)

Wir erstellen nun eine Kreuztabelle für sex und death. Für percent_pattern geben wir eine spezielle Funktion an (diese müssen Sie sich nicht merken):

crosstable(data=rhc,
           # Variablen für die Kreuztabelle
           cols=c(age, sex),
           # Welche Prozentangaben sollen angezeigt werden?
           total = "both",
           # Wie sollen die Prozentangaben dargestellt werden?
           percent_pattern="{n} ({p_row}/{p_col})") %>%
       # Ansprechendere Formatierung
       as_flextable()
Crosstable-Tabelle ohne by-Argument: Alter (Min/Max, Median, Mittelwert, N) und Geschlecht mit Anzahlen und Prozentangaben

Wie Sie sehen, hat die Funktion keine Kreuztabelle ergeben. Das liegt daran, dass wir das Argument by vergessen haben, was wir nun korrigieren:

crosstable(rhc,
           cols=c(age, sex),
           by=death,
           total = "both",
           percent_pattern="{n} ({p_row}/{p_col})") %>%
  as_flextable()
Crosstable-Kreuztabelle von Alter und Geschlecht, stratifiziert nach death (No/Yes), mit Summenspalte, Anzahlen sowie Zeilen- und Spaltenprozenten

Die Funktion kann verwendet werden, um alle Variablen stratifiziert nach beispielsweise death zu inspizieren. Um alle Variablen zu inspizieren, wird cols=everything() angegeben:

crosstable(rhc,
           cols=everything(),
           by=death,
           total = "both",
           percent_pattern="{n} ({p_row}/{p_col})") %>%
  as_flextable()
Gekürzte Crosstable-Tabelle aller Variablen der RHC-Daten, stratifiziert nach death, mit deskriptiver Statistik je Variable

Die Abbildung ist gekürzt.