Kontigenztabellen in R

1 Pakete und Daten

library(tidyverse)  # data wrangling

data("mtcars")

2 Häufigkeiten berechnen

2.1 Tidyverse

2.1.1 Univariat

Wie viele Autos gibt es mit Automatik- bzw. mit manueller Schaltung? Anders gesagt: Was ist die Häufigkeitverteilung von am?

mtcars %>% 
  count(am)
#>   am  n
#> 1  0 19
#> 2  1 13

Anteile dazu:

mtcars %>% 
  count(am) %>% 
  mutate(prop = n / sum(n))
#>   am  n    prop
#> 1  0 19 0.59375
#> 2  1 13 0.40625

2.1.2 Bivariat

Wie viele Autos mit mehr als 100 PS gibt es in den Stufen von am?

mtcars %>%  
  count(am, hp > 200) %>% 
  mutate(prop = n / sum(n))
#>   am hp > 200  n    prop
#> 1  0    FALSE 14 0.43750
#> 2  0     TRUE  5 0.15625
#> 3  1    FALSE 11 0.34375
#> 4  1     TRUE  2 0.06250

Die Anteile sind hier auf alle Autos bezogen.

2.1.3 Bezogen auf was?

Vielleicht möchten wir die Anteile lieber pro Stufe von am?

mtcars %>%  
  count(am, hp > 200) %>% 
  group_by(am) %>% 
  mutate(prop = n / sum(n))
#> # A tibble: 4 × 4
#> # Groups:   am [2]
#>      am `hp > 200`     n  prop
#>   <dbl> <lgl>      <int> <dbl>
#> 1     0 FALSE         14 0.737
#> 2     0 TRUE           5 0.263
#> 3     1 FALSE         11 0.846
#> 4     1 TRUE           2 0.154

2.1.4 Kontingenztabelle durch Pivotieren

Nicht wirklich praktisch im Tidyverse:

mtcars %>%  
  count(am, hp > 200) %>% 
  group_by(am) %>% 
  mutate(prop = n / sum(n)) %>% 
  select(-n) %>% 
  pivot_wider(names_from = am, values_from = prop)
#> # A tibble: 2 × 3
#>   `hp > 200`   `0`   `1`
#>   <lgl>      <dbl> <dbl>
#> 1 FALSE      0.737 0.846
#> 2 TRUE       0.263 0.154

2.2 Easystats

library(easystats)

Mit data_tabulate() bekommt man Häufigkeitstabellen, aber keine “richtigen” Kontingenztabellen, scheint’s:

data_tabulate(mtcars, select = c("am", "vs"))
#> am (am) <numeric>
#> # total N=32 valid N=32
#> 
#> Value |  N | Raw % | Valid % | Cumulative %
#> ------+----+-------+---------+-------------
#> 0     | 19 | 59.38 |   59.38 |        59.38
#> 1     | 13 | 40.62 |   40.62 |       100.00
#> <NA>  |  0 |  0.00 |    <NA> |         <NA>
#> 
#> vs (vs) <numeric>
#> # total N=32 valid N=32
#> 
#> Value |  N | Raw % | Valid % | Cumulative %
#> ------+----+-------+---------+-------------
#> 0     | 18 | 56.25 |   56.25 |        56.25
#> 1     | 14 | 43.75 |   43.75 |       100.00
#> <NA>  |  0 |  0.00 |    <NA> |         <NA>

data_tabulate gibt’s wohl erst ab 0.4.0.17 in {{datawizard}}.

mtcars %>% 
  group_by(am) %>% 
  data_tabulate("vs")
#> vs (vs) <numeric>
#> Grouped by am (0)
#> # total N=19 valid N=19
#> 
#> Value |  N | Raw % | Valid % | Cumulative %
#> ------+----+-------+---------+-------------
#> 0     | 12 | 63.16 |   63.16 |        63.16
#> 1     |  7 | 36.84 |   36.84 |       100.00
#> <NA>  |  0 |  0.00 |    <NA> |         <NA>
#> 
#> vs (vs) <numeric>
#> Grouped by am (1)
#> # total N=13 valid N=13
#> 
#> Value | N | Raw % | Valid % | Cumulative %
#> ------+---+-------+---------+-------------
#> 0     | 6 | 46.15 |   46.15 |        46.15
#> 1     | 7 | 53.85 |   53.85 |       100.00
#> <NA>  | 0 |  0.00 |    <NA> |         <NA>

2.3 sjmisc

library(sjmisc)

2.3.1 Kontingenztabelle

mtcars %>% 
  flat_table(am, vs)
#>    vs  0  1
#> am         
#> 0     12  7
#> 1      6  7

2.3.2 Anteile

Aufsummiert pro Zeile:

mtcars %>% 
  flat_table(am, vs, margin = "row")
#>    vs     0     1
#> am               
#> 0     63.16 36.84
#> 1     46.15 53.85

Aufsummiert pro Spalte:

mtcars %>% 
  flat_table(am, vs, margin = "col")
#>    vs     0     1
#> am               
#> 0     66.67 50.00
#> 1     33.33 50.00

Aufsummiert auf die ganze Tabelle:

mtcars %>% 
  flat_table(am, vs, margin = "cell")
#>    vs     0     1
#> am               
#> 0     37.50 21.88
#> 1     18.75 21.88

2.3.3 Kontingenztabelle gruppiert

mtcars %>% 
  group_by(hp > 100) %>% 
  flat_table(am, vs)
#>                              vs  0  1
#> hp > 100...1 am hp > 100...3         
#> FALSE        0  FALSE            0  3
#>                 TRUE             0  0
#>              1  FALSE            1  5
#>                 TRUE             0  0
#> TRUE         0  FALSE            0  0
#>                 TRUE            12  4
#>              1  FALSE            0  0
#>                 TRUE             5  2

2.4 Base R

2.4.1 Kontingenztabelle

table(mtcars$am, mtcars$vs)
#>    
#>      0  1
#>   0 12  7
#>   1  6  7

Oder, komfortabler:

with(mtcars, table(am, vs))
#>    vs
#> am   0  1
#>   0 12  7
#>   1  6  7

2.4.2 ftable

Auch nett:

mtcars %>% 
  select(am, vs) %>% 
  ftable()
#>    vs  0  1
#> am         
#> 0     12  7
#> 1      6  7

2.4.3 Anteile

table(mtcars$am, mtcars$vs) %>% prop.table()
#>    
#>           0       1
#>   0 0.37500 0.21875
#>   1 0.18750 0.21875

Bzw.:

with(mtcars, table(am, vs)) %>% prop.table()
#>    vs
#> am        0       1
#>   0 0.37500 0.21875
#>   1 0.18750 0.21875

Mit margin kann man die Dimension (Spalten vs. Zeilenin 2D) wählen, über die summiert wird.

Summiere pro Spalte:

with(mtcars, table(am, vs)) %>% prop.table(margin = 1)
#>    vs
#> am          0         1
#>   0 0.6315789 0.3684211
#>   1 0.4615385 0.5384615

Summiere pro Zeile:

with(mtcars, table(am, vs)) %>% prop.table(margin = 2)
#>    vs
#> am          0         1
#>   0 0.6666667 0.5000000
#>   1 0.3333333 0.5000000

3 Schöne Tabellen in html

3.1 gt

library(gt)

Naja, geht so:

3.1.1 flat_table

mtcars %>%
  flat_table(am, vs, margin = "cell") %>% 
  as_tibble() %>% 
  gt()
am vs Freq
0 0 37.50
1 0 18.75
0 1 21.88
1 1 21.88

3.1.2 pivot_wider

mtcars %>%  
  count(am, hp > 200) %>% 
  group_by(am) %>% 
  mutate(prop = n / sum(n)) %>% 
  select(-n) %>% 
  pivot_wider(names_from = am, values_from = prop) %>% 
  gt()
hp > 200 0 1
FALSE 0.7368421 0.8461538
TRUE 0.2631579 0.1538462

4 Exportieren

4.1 Export als CSV- oder XLSX-Datei

Tidyverse gibt stets Tabellen (Tibbles) zurück, das macht es einfach, da Tibbles direkt als CSV- oder Excel-Tabellen abgespeichert werden können:

meine_tab <- 
  mtcars %>%  
  count(am, hp > 200) %>% 
  group_by(am) %>% 
  mutate(prop = n / sum(n))

Und raus mit euch:

write_csv(meine_tab, "meine_tab.csv")

4.1.1 CSV für Excel

Achtung: Excel will liebe eine besondere CSV-Datei, aus der Hilfeseite:

All columns are encoded as UTF-8. write_excel_csv() and write_excel_csv2() also include a UTF-8 Byte order mark which indicates to Excel the csv is UTF-8 encoded.

write_excel_csv(meine_tab, "meine_tab_excel.csv")

4.1.2 Deutsch formatierte Excel-CSV

write_excel_csv2(meine_tab, "meine_tab_excel2.csv")

4.1.3 XLSX-Datei

Das Paket {{rio}} stellt eine praktische Import und Exportfunktion bereit, die nutzen wir:

library(rio)
export(meine_tab, file = "meine_tab.xlsx")

4.2 Export nach Word

4.2.1 Tabelle in Word auf Basis von Textdaten erstellen

Hier ist eine Anleitung, wie man eine CSV-Datei in Word als Tabelle einfügt.

4.2.2 Copy-Paste aus RStudio

  1. html-Ausgabe, z.B. von gt() suchen
  2. Alles markieren (z.B. rechte Maustaste “select all”)
  3. Copy
  4. Nach Word gehen
  5. Paste

Hat auf diesem Rechner hier gut funktioniert.

Ein Nutzer auf StackOverflow hat noch eine andere Idee:

Another possible solution: The above strategy did not work for me when I had a similar issue, but it was resolved once I knitted the table1 object and opened the html in browser to copy the html table and successfully paste into word. Doing it within RStudio viewer would not work for me for some reason.

4.2.3 Flextable

4.2.4 Let’s go

flextable hat eine nette Webseite.

library(flextable)
flextable(meine_tab)

Es gibt viele Funktionen bzw. Einstellungsmöglichkeiten für Flextable, die Sie auf der zugehörigen Webseite nachlesen können.

Die Gallerie sieht recht beeindruckend aus.

4.2.5 Export

Zuerst erzeugen wir ein Objekt vom Typ flextable:

meine_tab_flex <- flextable(meine_tab)

Und dann exporiteren wir:

save_as_docx("Tabelle 1 " = meine_tab_flex, path = "meine_tab.docx")

save_as_pptx("Tabelle 1 " = meine_tab_flex, path = "meine_tab.pptx")

5 Reproducibility

#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.3 (2022-03-10)
#>  os       macOS Big Sur/Monterey 10.16
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       Europe/Berlin               
#>  date     2022-05-02                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package     * version date       lib source                            
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)                    
#>  backports     1.4.1   2021-12-13 [1] CRAN (R 4.1.0)                    
#>  blogdown      1.8     2022-02-16 [2] CRAN (R 4.1.2)                    
#>  bookdown      0.24.2  2021-10-15 [1] Github (rstudio/bookdown@ba51c26) 
#>  brio          1.1.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  broom         0.7.12  2022-01-28 [1] CRAN (R 4.1.2)                    
#>  bslib         0.3.1   2021-10-06 [1] CRAN (R 4.1.0)                    
#>  cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.0)                    
#>  callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.0)                    
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.1.0)                    
#>  cli           3.2.0   2022-02-14 [1] CRAN (R 4.1.2)                    
#>  codetools     0.2-18  2020-11-04 [2] CRAN (R 4.1.3)                    
#>  colorout    * 1.2-2   2022-01-04 [1] Github (jalvesaq/colorout@79931fd)
#>  colorspace    2.0-3   2022-02-21 [1] CRAN (R 4.1.2)                    
#>  crayon        1.5.1   2022-03-26 [1] CRAN (R 4.1.2)                    
#>  DBI           1.1.2   2021-12-20 [1] CRAN (R 4.1.0)                    
#>  dbplyr        2.1.1   2021-04-06 [1] CRAN (R 4.1.0)                    
#>  desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.0)                    
#>  devtools      2.4.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  digest        0.6.29  2021-12-01 [1] CRAN (R 4.1.0)                    
#>  dplyr       * 1.0.8   2022-02-08 [1] CRAN (R 4.1.2)                    
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)                    
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)                    
#>  fansi         1.0.3   2022-03-24 [1] CRAN (R 4.1.2)                    
#>  fastmap       1.1.0   2021-01-25 [2] CRAN (R 4.1.0)                    
#>  forcats     * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)                    
#>  fs            1.5.2   2021-12-08 [1] CRAN (R 4.1.0)                    
#>  generics      0.1.2   2022-01-31 [1] CRAN (R 4.1.2)                    
#>  ggplot2     * 3.3.5   2021-06-25 [2] CRAN (R 4.1.0)                    
#>  glue          1.6.2   2022-02-24 [1] CRAN (R 4.1.2)                    
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 4.1.0)                    
#>  haven         2.4.3   2021-08-04 [1] CRAN (R 4.1.0)                    
#>  hms           1.1.1   2021-09-26 [1] CRAN (R 4.1.0)                    
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.0)                    
#>  httr          1.4.2   2020-07-20 [1] CRAN (R 4.1.0)                    
#>  jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.1.0)                    
#>  jsonlite      1.7.3   2022-01-17 [1] CRAN (R 4.1.2)                    
#>  knitr         1.37    2021-12-16 [1] CRAN (R 4.1.0)                    
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.0)                    
#>  lubridate     1.8.0   2021-10-07 [1] CRAN (R 4.1.0)                    
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.1.2)                    
#>  memoise       2.0.0   2021-01-26 [2] CRAN (R 4.1.0)                    
#>  modelr        0.1.8   2020-05-19 [1] CRAN (R 4.1.0)                    
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.1.0)                    
#>  pillar        1.7.0   2022-02-01 [1] CRAN (R 4.1.2)                    
#>  pkgbuild      1.2.0   2020-12-15 [2] CRAN (R 4.1.0)                    
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)                    
#>  pkgload       1.2.4   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.0)                    
#>  processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.0)                    
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.0)                    
#>  purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)                    
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.0)                    
#>  Rcpp          1.0.8.3 2022-03-17 [1] CRAN (R 4.1.2)                    
#>  readr       * 2.1.2   2022-01-30 [1] CRAN (R 4.1.2)                    
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 4.1.0)                    
#>  remotes       2.4.0   2021-06-02 [2] CRAN (R 4.1.0)                    
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.0)                    
#>  rlang         1.0.2   2022-03-04 [1] CRAN (R 4.1.2)                    
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.0)                    
#>  rprojroot     2.0.2   2020-11-15 [2] CRAN (R 4.1.0)                    
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)                    
#>  rvest         1.0.2   2021-10-16 [1] CRAN (R 4.1.0)                    
#>  sass          0.4.0   2021-05-12 [1] CRAN (R 4.1.0)                    
#>  scales        1.2.0   2022-04-13 [1] CRAN (R 4.1.3)                    
#>  sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 4.1.0)                    
#>  stringi       1.7.6   2021-11-29 [1] CRAN (R 4.1.0)                    
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)                    
#>  testthat      3.1.2   2022-01-20 [1] CRAN (R 4.1.2)                    
#>  tibble      * 3.1.6   2021-11-07 [1] CRAN (R 4.1.0)                    
#>  tidyr       * 1.2.0   2022-02-01 [1] CRAN (R 4.1.2)                    
#>  tidyselect    1.1.2   2022-02-21 [1] CRAN (R 4.1.2)                    
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)                    
#>  tzdb          0.1.2   2021-07-20 [2] CRAN (R 4.1.0)                    
#>  usethis       2.0.1   2021-02-10 [2] CRAN (R 4.1.0)                    
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)                    
#>  vctrs         0.4.0   2022-03-30 [1] CRAN (R 4.1.2)                    
#>  withr         2.5.0   2022-03-03 [1] CRAN (R 4.1.2)                    
#>  xfun          0.29    2021-12-14 [1] CRAN (R 4.1.0)                    
#>  xml2          1.3.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  yaml          2.2.2   2022-01-25 [1] CRAN (R 4.1.2)                    
#> 
#> [1] /Users/sebastiansaueruser/Library/R/x86_64/4.1/library
#> [2] /Library/Frameworks/R.framework/Versions/4.1/Resources/library