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
- html-Ausgabe, z.B. von
gt()
suchen - Alles markieren (z.B. rechte Maustaste “select all”)
- Copy
- Nach Word gehen
- 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)
am | hp > 200 | n | prop |
0 | FALSE | 14 | 0.7368421 |
0 | TRUE | 5 | 0.2631579 |
1 | FALSE | 11 | 0.8461538 |
1 | TRUE | 2 | 0.1538462 |
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