26  Schritt 2: Daten tidy machen

Der zweite Schritt besteht darin, die Daten tidy zu machen, das heisst, sie ins long table Format zu überführen. Schauen wir uns hierfür die Matrix der Pflegeberufe an, die ja im wide Format vorliegt:

Pflegeberufe
##                          1999   2001   2003   2005   2007   2009   2011   2013
## Krankenpflegeassistenz  16624  19061  19478  21537  27731  36481  46517  54371
## Altenpflegehilfe        55770  52710  49727  45776  48326  47903  47978  48363
## Kinderkrankenpflege     47779  48203  48822  48519  49080  49307  48291  48937
## Krankenpflege          430983 436767 444783 449355 457322 465446 468192 472580
## Altenpflege            109161 124879 141965 158817 178902 194195 208304 227154
##                          2015
## Krankenpflegeassistenz  64127
## Altenpflegehilfe        49507
## Kinderkrankenpflege     48913
## Krankenpflege          476416
## Altenpflege            246412

Die Reihennamen repräsentieren Variablen.

Da im Tidyverse fast alles über tibbles bzw. Datenframes abläuft, muss die Matrix zunächst in ein tibble überführt werden. Hierfür verwenden wir die Funktion as_tibble()

tbl <- as_tibble(Pflegeberufe)
head(tbl)
## # A tibble: 5 × 9
##   `1999` `2001` `2003` `2005` `2007` `2009` `2011` `2013` `2015`
##    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1  16624  19061  19478  21537  27731  36481  46517  54371  64127
## 2  55770  52710  49727  45776  48326  47903  47978  48363  49507
## 3  47779  48203  48822  48519  49080  49307  48291  48937  48913
## 4 430983 436767 444783 449355 457322 465446 468192 472580 476416
## 5 109161 124879 141965 158817 178902 194195 208304 227154 246412

Wie Sie sehen, wurden die Spalten (Jahre) als Variablen übernommen. Die Informationen aus den Zeilen (Berufsgruppe) ist verloren gegangen. Für fügen sie daher per cbind() unserem tibble hinzu.

tbl <- cbind(tbl, Berufsgruppe = rownames(Pflegeberufe))
head(tbl)
##     1999   2001   2003   2005   2007   2009   2011   2013   2015
## 1  16624  19061  19478  21537  27731  36481  46517  54371  64127
## 2  55770  52710  49727  45776  48326  47903  47978  48363  49507
## 3  47779  48203  48822  48519  49080  49307  48291  48937  48913
## 4 430983 436767 444783 449355 457322 465446 468192 472580 476416
## 5 109161 124879 141965 158817 178902 194195 208304 227154 246412
##             Berufsgruppe
## 1 Krankenpflegeassistenz
## 2       Altenpflegehilfe
## 3    Kinderkrankenpflege
## 4          Krankenpflege
## 5            Altenpflege

Zur Überführung in ein korrektes tibble vom Format long table wird die Funktion pivot_longer() aus dem Tidyverse-Paket tidyr verwendet. Die Logik der Funktion besteht darin, die Variable mit den ehemaligen Reihennamen (die per cbind() hinzugefügt wurde), bestehen zu lassen. Aus den übrigen Spalten werden neue Variablen erzeugt, deren Werte passend zu den Reihenwerten (der cbind()-Spalte) eingetragen werden. In unserem Beispiel ist die (neue) Variable Berufsgruppe in Spalte 10. Wir belassen also Spalte 10, und wenden die Funktion auf die Spalten 1-9 an.

Pflegetibble <- pivot_longer(tbl, 
             # wähle die Spalten 1-9 aus
             cols=1:9, 
             # speichere Spaltennamen als Werte in neuer Variable "Jahr"
             names_to="Jahr", 
             # Die derzeitigen Werte werden in der neuen Variable "Anzahl" gespeichert
             values_to = "Anzahl")

head(Pflegetibble)
## # A tibble: 6 × 3
##   Berufsgruppe           Jahr  Anzahl
##   <chr>                  <chr>  <dbl>
## 1 Krankenpflegeassistenz 1999   16624
## 2 Krankenpflegeassistenz 2001   19061
## 3 Krankenpflegeassistenz 2003   19478
## 4 Krankenpflegeassistenz 2005   21537
## 5 Krankenpflegeassistenz 2007   27731
## 6 Krankenpflegeassistenz 2009   36481

Mit der Funktion pivot_wider() kann im Gegenzug eine wide table erstellt werden. Ihr wird übergeben, aus welcher Variable die neuen Spalten gebildet werden sollen, und aus welcher Variable die anzuzeigenden Werte zu nehmen sind. Für unser Pflegetibble lautet der Befehl:

pivot_wider(Pflegetibble, names_from = Jahr, values_from = Anzahl)
## # A tibble: 5 × 10
##   Berufsgruppe    `1999` `2001` `2003` `2005` `2007` `2009` `2011` `2013` `2015`
##   <chr>            <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 Krankenpflegea…  16624  19061  19478  21537  27731  36481  46517  54371  64127
## 2 Altenpflegehil…  55770  52710  49727  45776  48326  47903  47978  48363  49507
## 3 Kinderkrankenp…  47779  48203  48822  48519  49080  49307  48291  48937  48913
## 4 Krankenpflege   430983 436767 444783 449355 457322 465446 468192 472580 476416
## 5 Altenpflege     109161 124879 141965 158817 178902 194195 208304 227154 246412

26.1 verschachtelte wide table

Schauen wir uns folgende Tabelle an:

untidy_df
##   Altersgruppe Maenner_2018 Frauen_2018 Maenner_2019 Frauen_2019 Maenner_2020
## 1         < 18        22000       20000        22000       20000        23000
## 2        18-30        36000       35000        36000       35000        38000
## 3        31-50        50000       40000        50000       40000        52000
## 4        51-60        62000       60000        62000       60000        65000
## 5         > 60        75000       72000        75000       72000        78000
##   Frauen_2020
## 1       21000
## 2       36000
## 3       47000
## 4       62000
## 5       75000

Diese Tabelle ist mehrfach verschachtelt. Zum einen haben wir “bedeutsame Reihennamen” in Form der Altersgruppe. Zum anderen sind auch in den Spaltennamen jeweils 2 Variablen “versteckt”, nämlich das Geschlecht und das Jahr.

Um diese Tabelle tidy zu machen, müssen wir in 2 Schritten vor gehen.

Mit der Funktion pivot_longer bringen wir die Daten in eine erste long table-Version. Für den Datensatz untidy_df belassen wir die Variable Altersgruppe und wenden die Funktion auf die übrigen Spalten an.

untidy_df %>% 
  pivot_longer(cols = Maenner_2018:Frauen_2020, 
               names_to="Geschlecht_Jahr", 
               values_to = "Einkommen") %>% 
  head(10)
## # A tibble: 10 × 3
##   Altersgruppe Geschlecht_Jahr Einkommen
##   <chr>        <chr>               <dbl>
## 1 < 18         Maenner_2018        22000
## 2 < 18         Frauen_2018         20000
## 3 < 18         Maenner_2019        22000
## 4 < 18         Frauen_2019         20000
## 5 < 18         Maenner_2020        23000
## 6 < 18         Frauen_2020         21000
## # ℹ 4 more rows

Wie Sie sehen, hat pivot_longer() die Altersgruppen ebenfalls richtig zugeordnet.

Im zweiten Schritt teilen wir die Variable Geschlecht_Jahr in zwei eigene Variablen Geschlecht und Jahr auf. Hierfür steht die Funktion separate() zur Verfügung.

untidy_df %>% 
  pivot_longer(cols = Maenner_2018:Frauen_2020, 
               names_to="Geschlecht_Jahr", 
               values_to = "Einkommen") %>% 
  separate(Geschlecht_Jahr, 
           into = c("Geschlecht", "Jahr")) %>% 
  head(10)
## # A tibble: 10 × 4
##   Altersgruppe Geschlecht Jahr  Einkommen
##   <chr>        <chr>      <chr>     <dbl>
## 1 < 18         Maenner    2018      22000
## 2 < 18         Frauen     2018      20000
## 3 < 18         Maenner    2019      22000
## 4 < 18         Frauen     2019      20000
## 5 < 18         Maenner    2020      23000
## 6 < 18         Frauen     2020      21000
## # ℹ 4 more rows

Die Daten liegen nun vollständig als tidy data vor.

26.2 Datentypen korrigieren

Gerade bei importierten Daten sollte überprüft werden, ob den Variablen der korrekte Datentyp (numerisch, faktorial, logisch) zugewiesen ist. Dies ist wichtig, wenn wir mit ihnen später die Statistikfunktionen aufrufen.

Schauen wir unser Pflegetibble an

glimpse(Pflegetibble)
## Rows: 45
## Columns: 3
## $ Berufsgruppe <chr> "Krankenpflegeassistenz", "Krankenpflegeassistenz", "Kran…
## $ Jahr         <chr> "1999", "2001", "2003", "2005", "2007", "2009", "2011", "…
## $ Anzahl       <dbl> 16624, 19061, 19478, 21537, 27731, 36481, 46517, 54371, 6…

Die Variablen Berufsgruppe und Jahr sind beide vom Typ chr, was falsch ist. Überführen wir die Berufsgruppen in einen Faktor, und die Jahre in numerische Werte. Im klassischen R geht dies so:

Pflegetibble$Berufsgruppe <- as.factor(Pflegetibble$Berufsgruppe)
Pflegetibble$Jahr <- as.numeric(Pflegetibble$Jahr)
glimpse(Pflegetibble)
## Rows: 45
## Columns: 3
## $ Berufsgruppe <fct> Krankenpflegeassistenz, Krankenpflegeassistenz, Krankenpf…
## $ Jahr         <dbl> 1999, 2001, 2003, 2005, 2007, 2009, 2011, 2013, 2015, 199…
## $ Anzahl       <dbl> 16624, 19061, 19478, 21537, 27731, 36481, 46517, 54371, 6…

Im Tidyverse kann man die Datentypen mit den Funktionen mutate() (wird später erleutert) und across() umwandeln. Letztere ist das Pendant zum klassischen apply() und erlaubt es, Funktionen auf ausgewählte Spalten (Variablen) des Datensatzes anzuwenden.

Pflegetibble <- Pflegetibble %>% 
  # wende auf Spalte "Berufsgruppe" die Funktion as.factor an.
  mutate(across(Berufsgruppe, as.factor)) %>% 
  # wende auf Spalte "Jar" die Funktion as.numeric an.
  mutate(across(Jahr, as.numeric))
glimpse(Pflegetibble)
## Rows: 45
## Columns: 3
## $ Berufsgruppe <fct> Krankenpflegeassistenz, Krankenpflegeassistenz, Krankenpf…
## $ Jahr         <dbl> 1999, 2001, 2003, 2005, 2007, 2009, 2011, 2013, 2015, 199…
## $ Anzahl       <dbl> 16624, 19061, 19478, 21537, 27731, 36481, 46517, 54371, 6…

Sollen der auszuführenden Funktion Parameter übergeben werden, ändert sich der Aufruf - z.B. um einen ordinalen Faktore zu erzeugen, wie folgt:

Pflegetibble %>% 
  # wende auf Spalte "Berufsgruppe" die Funktion factor an.
  # Um Parameter an 'factor()' übergeben zu können,
  # muss folgende Notation erfolgen.
  # Erstelle ordinale Faktoren mit Parameter "ordered=T"
  mutate(across(Berufsgruppe, ~factor(.x, ordered=T))) %>% 
  head()
## # A tibble: 6 × 3
##   Berufsgruppe            Jahr Anzahl
##   <ord>                  <dbl>  <dbl>
## 1 Krankenpflegeassistenz  1999  16624
## 2 Krankenpflegeassistenz  2001  19061
## 3 Krankenpflegeassistenz  2003  19478
## 4 Krankenpflegeassistenz  2005  21537
## 5 Krankenpflegeassistenz  2007  27731
## 6 Krankenpflegeassistenz  2009  36481


Schauen wir uns als weiteres Beispiel den gelabelten Datensazt der Nachtwachenstudie an.

# lade den Nachtwachendatensatz
load(url("https://www.produnis.de/R/data/nw.RData"))

#nutze die gelabelte Version
test <- nw_labelled

# wenn Sie das Paket jgsbook installiert haben, 
# können Sie den Datensatz auch so laden:
test <- jgsbook::nw_labelled
glimpse(test)
## Rows: 276
## Columns: 49
## $ sex               <fct> männlich, weiblich, weiblich, weiblich, weiblich, we…
## $ age               <labelled> 56, 53, 55, 28, 53, 62, 55, 61, 34, 50, 54, 50,…
## $ land              <fct> Nordrhein-Westfalen, Nordrhein-Westfalen, Nordrhein-…
## $ host              <fct> "privater Träger", "Wohlfahrtsverband (z.B. AWO, Car…
## $ bed               <fct> weniger als 10, 75 - 100, 100 - 150, 100 - 150, 75 -…
## $ patient           <fct> 10 - 20, 75 - 100, 100 - 150, 100 - 150, 75 - 100, 1…
## $ liability         <labelled> 5, 30, 34, 23, 30, 41, 79, 79, 52, 32, 71, 71, …
## $ Stufe0            <labelled> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 25, 25, 0, 0, 0, …
## $ Stufe1            <labelled> 3, 0, 10, 4, 0, 14, 15, 8, 6, 9, 15, 15, 9, 10,…
## $ Stufe2            <labelled> 9, 10, 19, 17, 11, 19, 29, 14, 32, 14, 19, 19, …
## $ Stufe3            <labelled> 12, 20, 5, 2, 19, 7, 23, 18, 14, 10, 12, 12, 14…
## $ Demenz            <labelled> 7, 20, 16, 8, 28, 7, 60, 31, 32, 22, 21, 21, 20…
## $ Bettgitter        <labelled> 2, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 11, 1…
## $ Bettgurt          <labelled> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ Schlafmittel      <labelled> 7, 6, 5, 0, 5, 9, 7, 2, 15, 4, 4, 4, 4, 0, 26, …
## $ colleagueall      <labelled> 2, 3, 5, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 2, 2, 6,…
## $ colleague         <labelled> 1, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2,…
## $ pause             <fct> selten, immer, häufig, immer, immer, manchmal, immer…
## $ pausecolleague    <fct> nie, immer, nie, immer, immer, nie, immer, immer, ni…
## $ hintergrunddienst <fct> NA, Ja, Ja, Ja, Ja, NA, NA, Ja, Ja, Ja, Ja, Ja, Ja, …
## $ daynights         <fct> "hauptsächlich im Nachtdienst, mit vereinzelten Tagd…
## $ whynight          <fct> NA, die Arbeitszeiten sagen mir zu, NA, familiäre Gr…
## $ nights            <labelled> 6, 7, 8, 5, 7, 7, 7, 7, 5, 5, 7, 5, 9, 9, 8, 8,…
## $ timework          <fct> Vollzeit, Teilzeit, NA, Teilzeit, Teilzeit, NA, NA, …
## $ nightstarts       <labelled> "1970-01-01 20:33:00", "1970-01-01 20:30:00", "…
## $ nightstops        <labelled> "1970-01-01 07:07:00", "1970-01-01 07:00:00", "…
## $ MagNacht          <fct> eher ja, ja, ja, ja, ja, ja, ja, ja, ja, ja, ja, ja,…
## $ WiederTag         <fct> neutral, nein, nein, neutral, nein, nein, nein, nein…
## $ ueberfordert      <fct> selten, nie, nie, nie, selten, selten, nie, selten, …
## $ Zwischenfall      <fct> selten, selten, häufig, selten, häufig, selten, selt…
## $ Bew_herumirren    <fct> sehr oft, häufig, selten, häufig, häufig, selten, hä…
## $ Bew_sterben       <fct> selten, häufig, häufig, selten, häufig, selten, selt…
## $ muede             <fct> selten, nie, nie, häufig, selten, nie, nie, selten, …
## $ schwer_wach       <fct> nie, nie, nie, selten, selten, nie, nie, nie, nie, n…
## $ Demenz_aktiv      <labelled> 10, 7, 5, 5, 7, 7, 3, 5, NA, 5, 5, 5, 4, 4, 7, …
## $ Demenz_stoeren    <labelled> 8, 7, 3, 3, 7, 0, 3, 2, NA, 5, 5, 5, 2, 1, 7, 7…
## $ Demenz_sediert    <labelled> 3, 7, 1, 0, 2, 0, 0, 1, NA, 2, 2, 2, 0, 0, 5, 7…
## $ Demenz_nv         <labelled> 10, 4, 4, 0, 1, 7, 0, 0, NA, 0, 0, 0, 0, 0, 7, …
## $ Sorge_weglaufen   <fct> eher ja, ja, eher ja, nein, eher nicht, eher nicht, …
## $ Sorge_Sturz       <fct> ja, nein, ja, ja, eher ja, eher nicht, neutral, ja, …
## $ Sorge_FEM         <fct> ja, NA, NA, nein, neutral, eher ja, NA, neutral, nei…
## $ Sorge_nv          <fct> ja, neutral, eher ja, eher nicht, nein, eher nicht, …
## $ Sorge_sterben     <fct> eher ja, ja, ja, eher nicht, eher ja, ja, eher nicht…
## $ workyear          <labelled> 35, 37, 37, 10, 30, 34, 13, 28, 4, 32, 10, 32, …
## $ worknight         <labelled> 12, 11, 32, 1, 14, 29, 7, 13, 2, 5, 10, 5, 17, …
## $ meeting           <fct> selten, immer, NA, nie, immer, manchmal, selten, sel…
## $ fortbildung       <fct> Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, …
## $ wannfort          <labelled> 2004, 2014, 2013, 2013, 2014, 2015, 2014, 2015,…
## $ edu               <fct> dreijährige Pflegeausbildung, zweijährige Pflegeausb…

Wir sehen, dass viele Variablen vom Typ labelled sind. Schauen wir uns die Variablen age und sex genauer an.

class(test$age)
## [1] "labelled" "numeric"
class(test$sex)
## [1] "labelled" "factor"

Die Variablen ist sowhohl vom Typ labelled als auch vom Typ numeric bzw. factor. Manche R-Funktionen haben mit dieser Doppelbelegung ihre Probleme, z.B. vtable::sumtable().

vtable::sumtable(test$age)
Fehler in vtable::sumtable(test$age) : 
It doesn't look like you have any variables that belong in a sumtable. Check your data. Use vars to explicitly choose variables, or convert things to numeric or factor before sending to sumtable.

Wir sollten daher alle Variablentypen eindeutig setzen. Die Funktion mutate_if() wendet eine Funktion an, wenn die gesetzten Bedingungen erfüllt sind. So möchten wir im ersten Schritt nur solche Spalten, die (zusätzlich zum Typ labelled) vom Typ numeric sind, den eindeutigen Typ numeric zuweisen. Im zweiten Schritt wiederholen wir dies für Faktoren.

test %>% 
  # wende nur auf labelled-numeric an 
  mutate_if(is.numeric, as.numeric) %>%
  # wende nur auf labelled-factor an 
  mutate_if(is.factor, as.factor) %>% 
  # wende nur auf die Spalet nightstarts nightstops an
  mutate(across(nightstarts:nightstops, as.character)) %>% 
  glimpse()
## Rows: 276
## Columns: 49
## $ sex               <fct> männlich, weiblich, weiblich, weiblich, weiblich, we…
## $ age               <dbl> 56, 53, 55, 28, 53, 62, 55, 61, 34, 50, 54, 50, 50, …
## $ land              <fct> Nordrhein-Westfalen, Nordrhein-Westfalen, Nordrhein-…
## $ host              <fct> "privater Träger", "Wohlfahrtsverband (z.B. AWO, Car…
## $ bed               <fct> weniger als 10, 75 - 100, 100 - 150, 100 - 150, 75 -…
## $ patient           <fct> 10 - 20, 75 - 100, 100 - 150, 100 - 150, 75 - 100, 1…
## $ liability         <dbl> 5, 30, 34, 23, 30, 41, 79, 79, 52, 32, 71, 71, 46, 5…
## $ Stufe0            <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 25, 25, 0, 0, 0, 0, 0,…
## $ Stufe1            <dbl> 3, 0, 10, 4, 0, 14, 15, 8, 6, 9, 15, 15, 9, 10, 31, …
## $ Stufe2            <dbl> 9, 10, 19, 17, 11, 19, 29, 14, 32, 14, 19, 19, 23, 1…
## $ Stufe3            <dbl> 12, 20, 5, 2, 19, 7, 23, 18, 14, 10, 12, 12, 14, 15,…
## $ Demenz            <dbl> 7, 20, 16, 8, 28, 7, 60, 31, 32, 22, 21, 21, 20, 25,…
## $ Bettgitter        <dbl> 2, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 11, 1, 3, …
## $ Bettgurt          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Schlafmittel      <dbl> 7, 6, 5, 0, 5, 9, 7, 2, 15, 4, 4, 4, 4, 0, 26, 1, 23…
## $ colleagueall      <dbl> 2, 3, 5, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 2, 2, 6, 2, 1…
## $ colleague         <dbl> 1, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1…
## $ pause             <fct> selten, immer, häufig, immer, immer, manchmal, immer…
## $ pausecolleague    <fct> nie, immer, nie, immer, immer, nie, immer, immer, ni…
## $ hintergrunddienst <fct> NA, Ja, Ja, Ja, Ja, NA, NA, Ja, Ja, Ja, Ja, Ja, Ja, …
## $ daynights         <fct> "hauptsächlich im Nachtdienst, mit vereinzelten Tagd…
## $ whynight          <fct> NA, die Arbeitszeiten sagen mir zu, NA, familiäre Gr…
## $ nights            <dbl> 6, 7, 8, 5, 7, 7, 7, 7, 5, 5, 7, 5, 9, 9, 8, 8, 3, 4…
## $ timework          <fct> Vollzeit, Teilzeit, NA, Teilzeit, Teilzeit, NA, NA, …
## $ nightstarts       <chr> "1970-01-01 20:33:00", "1970-01-01 20:30:00", "1970-…
## $ nightstops        <chr> "1970-01-01 07:07:00", "1970-01-01 07:00:00", "1970-…
## $ MagNacht          <fct> eher ja, ja, ja, ja, ja, ja, ja, ja, ja, ja, ja, ja,…
## $ WiederTag         <fct> neutral, nein, nein, neutral, nein, nein, nein, nein…
## $ ueberfordert      <fct> selten, nie, nie, nie, selten, selten, nie, selten, …
## $ Zwischenfall      <fct> selten, selten, häufig, selten, häufig, selten, selt…
## $ Bew_herumirren    <fct> sehr oft, häufig, selten, häufig, häufig, selten, hä…
## $ Bew_sterben       <fct> selten, häufig, häufig, selten, häufig, selten, selt…
## $ muede             <fct> selten, nie, nie, häufig, selten, nie, nie, selten, …
## $ schwer_wach       <fct> nie, nie, nie, selten, selten, nie, nie, nie, nie, n…
## $ Demenz_aktiv      <dbl> 10, 7, 5, 5, 7, 7, 3, 5, NA, 5, 5, 5, 4, 4, 7, 7, 6,…
## $ Demenz_stoeren    <dbl> 8, 7, 3, 3, 7, 0, 3, 2, NA, 5, 5, 5, 2, 1, 7, 7, 5, …
## $ Demenz_sediert    <dbl> 3, 7, 1, 0, 2, 0, 0, 1, NA, 2, 2, 2, 0, 0, 5, 7, 5, …
## $ Demenz_nv         <dbl> 10, 4, 4, 0, 1, 7, 0, 0, NA, 0, 0, 0, 0, 0, 7, 7, 6,…
## $ Sorge_weglaufen   <fct> eher ja, ja, eher ja, nein, eher nicht, eher nicht, …
## $ Sorge_Sturz       <fct> ja, nein, ja, ja, eher ja, eher nicht, neutral, ja, …
## $ Sorge_FEM         <fct> ja, NA, NA, nein, neutral, eher ja, NA, neutral, nei…
## $ Sorge_nv          <fct> ja, neutral, eher ja, eher nicht, nein, eher nicht, …
## $ Sorge_sterben     <fct> eher ja, ja, ja, eher nicht, eher ja, ja, eher nicht…
## $ workyear          <dbl> 35, 37, 37, 10, 30, 34, 13, 28, 4, 32, 10, 32, 27, 3…
## $ worknight         <dbl> 12, 11, 32, 1, 14, 29, 7, 13, 2, 5, 10, 5, 17, 32, 7…
## $ meeting           <fct> selten, immer, NA, nie, immer, manchmal, selten, sel…
## $ fortbildung       <fct> Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, Ja, …
## $ wannfort          <dbl> 2004, 2014, 2013, 2013, 2014, 2015, 2014, 2015, 2015…
## $ edu               <fct> dreijährige Pflegeausbildung, zweijährige Pflegeausb…

26.3 fehlende Werte

Fehlende Werte (NA) können mit der Funktion drop_na() entfernt werden. Die Funktion “dropt” dabei die komplette Datenreihe, wenn ein NA in einer angegebenen Spalte enthalten ist.

# lade Beispieldatensatz
load(url("https://www.produnis.de/R/data/pf8.RData" ))

# Schaue Variable "Gewicht" an
glimpse(pf8$Gewicht)
##  num [1:731] 69 67 NA 90 68 60 80 60 NA 60 ...

Variable Gewicht enthält 731 Werte, und wir sehen, dass auch NA enthalten sind.

Jetzt “droppen” wir alle Reihen, in denen bei der Variable Gewicht ein NA steht

pf8 %>% 
  drop_na(Gewicht) %>% 
      glimpse(.)
## Rows: 720
## Columns: 16
## $ Standort       <fct> Münster, Münster, Münster, Münster, Münster, Münster, M…
## $ Alter          <int> 18, 67, 61, 24, 21, 59, 56, 52, 79, 22, 19, 18, 17, 21,…
## $ Geschlecht     <fct> weiblich, weiblich, männlich, männlich, weiblich, weibl…
## $ Größe          <int> 172, 165, 182, 173, 177, 168, 156, 166, 161, 206, 163, …
## $ Gewicht        <dbl> 69, 67, 90, 68, 60, 80, 60, 60, 66, 130, 52, 68, 48, 54…
## $ Bildung        <fct> Abitur, mittlere Reife, mittlere Reife, Abitur, Abitur,…
## $ Beruf          <fct> Inspektor*in, Rentner*in, Beamter*in, Student*in, Stude…
## $ Familienstand  <fct> Partnerschaft, geschieden, ledig, ledig, Partnerschaft,…
## $ Kinder         <int> 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Wohnort        <fct> ländlich, ländlich, ländlich, städtisch, städtisch, län…
## $ Rauchen        <fct> nein, nein, nein, nein, ja, nein, ja, nein, nein, nein,…
## $ SportHäufig    <dbl> NA, 2.0, 4.0, 4.0, 1.0, 2.0, 1.0, 2.0, NA, 4.0, 5.0, 2.…
## $ SportMinuten   <dbl> NA, 60, 120, 60, 60, 45, 90, 45, NA, 90, 20, 120, 120, …
## $ SportWie       <fct> Allein, Gruppe, Allein, Allein, Gruppe, Gruppe, beides,…
## $ SportWarum     <fct> Arbeitsweg, Vorbeugung, Fitness, Gewichtsreduktion, Fit…
## $ LebenZufrieden <dbl> 5, 7, 2, 9, 8, 5, 8, 8, 8, 8, 7, 8, 7, 8, 7, 7, 8, 7, 1…

Der Datensatz pf8 wird mittels Pipe weitergeleitet. In der zweiten Zeile droppen wir alle Reihen mit Gewicht NA und geben das Resultat per Pipe weiter.

Mit glimpse() sehen wir das Resultat. Datensatz pf8 hat jetzt nur noch 720 Reihen, und nicht mehr 731.

Sollen alle NAs in allen Spalten entfernt werden, lautet der Befehl

pf8 %>% 
  drop_na(.) %>% 
      glimpse(.)
## Rows: 398
## Columns: 16
## $ Standort       <fct> Münster, Münster, Münster, Münster, Münster, Münster, M…
## $ Alter          <int> 67, 61, 24, 21, 59, 56, 52, 22, 19, 18, 17, 21, 72, 19,…
## $ Geschlecht     <fct> weiblich, männlich, männlich, weiblich, weiblich, weibl…
## $ Größe          <int> 165, 182, 173, 177, 168, 156, 166, 206, 163, 172, 158, …
## $ Gewicht        <dbl> 67, 90, 68, 60, 80, 60, 60, 130, 52, 68, 48, 54, 86, 65…
## $ Bildung        <fct> mittlere Reife, mittlere Reife, Abitur, Abitur, mittler…
## $ Beruf          <fct> Rentner*in, Beamter*in, Student*in, Student*in, arbeitl…
## $ Familienstand  <fct> geschieden, ledig, ledig, Partnerschaft, verheiratet, g…
## $ Kinder         <int> 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Wohnort        <fct> ländlich, ländlich, städtisch, städtisch, ländlich, stä…
## $ Rauchen        <fct> nein, nein, nein, ja, nein, ja, nein, nein, nein, nein,…
## $ SportHäufig    <dbl> 2.0, 4.0, 4.0, 1.0, 2.0, 1.0, 2.0, 4.0, 5.0, 2.5, 1.0, …
## $ SportMinuten   <dbl> 60, 120, 60, 60, 45, 90, 45, 90, 20, 120, 120, 80, 160,…
## $ SportWie       <fct> Gruppe, Allein, Allein, Gruppe, Gruppe, beides, Allein,…
## $ SportWarum     <fct> Vorbeugung, Fitness, Gewichtsreduktion, Fitness, Vorbeu…
## $ LebenZufrieden <dbl> 7, 2, 9, 8, 5, 8, 8, 8, 7, 8, 7, 8, 7, 8, 10, 8, 7, 9, …

Mit dieser radikalen Methode schrumpft der Datensatz pf8 auf 398 vollständige Datenreihen zusammen.

Sie können mit den Funktionen fill() und replace_na() fehlende Werte auffüllen oder ersetzen.

Hierbei ersetzt replace_na() alle NA durch einen vorgegebenen Wert, und fill() versucht, die NA durch wahrscheinliche Werte zu ersetzen. Dies ist hilfreich, wenn die Daten z.B. nach einem Kriterium sortiert sind.

test <- tibble(Beruf = factor(c("Bäcker", NA, "Bäcker", "Ärztin", NA, "Ärztin")))

# vorher
test
## # A tibble: 6 × 1
##   Beruf 
##   <fct> 
## 1 Bäcker
## 2 <NA>  
## 3 Bäcker
## 4 Ärztin
## 5 <NA>  
## 6 Ärztin
# ersetze NA
test %>% 
  tidyr::fill(Beruf)
## # A tibble: 6 × 1
##   Beruf 
##   <fct> 
## 1 Bäcker
## 2 Bäcker
## 3 Bäcker
## 4 Ärztin
## 5 Ärztin
## 6 Ärztin

Aufsteigende Werte können nicht erzeugt werden.

test <- tibble(Jahr = c(2014, NA, NA, NA, 2018, 2019, NA , NA , 2022))

# vorher
test
## # A tibble: 9 × 1
##    Jahr
##   <dbl>
## 1  2014
## 2    NA
## 3    NA
## 4    NA
## 5  2018
## 6  2019
## # ℹ 3 more rows
test %>% 
  tidyr::fill(Jahr)
## # A tibble: 9 × 1
##    Jahr
##   <dbl>
## 1  2014
## 2  2014
## 3  2014
## 4  2014
## 5  2018
## 6  2019
## # ℹ 3 more rows

26.4 Variablen umbenennen

Mit der Funktion rename() könne Sie die Variablennamen ändern.

Pflegetibble %>% 
  dplyr::rename(Neu=Berufsgruppe) %>% 
  head()
## # A tibble: 6 × 3
##   Neu                     Jahr Anzahl
##   <fct>                  <dbl>  <dbl>
## 1 Krankenpflegeassistenz  1999  16624
## 2 Krankenpflegeassistenz  2001  19061
## 3 Krankenpflegeassistenz  2003  19478
## 4 Krankenpflegeassistenz  2005  21537
## 5 Krankenpflegeassistenz  2007  27731
## 6 Krankenpflegeassistenz  2009  36481
Pflegetibble %>% 
  dplyr::rename(graduate=Berufsgruppe,
         year=Jahr,
         n=Anzahl) %>% 
            head()
## # A tibble: 6 × 3
##   graduate                year     n
##   <fct>                  <dbl> <dbl>
## 1 Krankenpflegeassistenz  1999 16624
## 2 Krankenpflegeassistenz  2001 19061
## 3 Krankenpflegeassistenz  2003 19478
## 4 Krankenpflegeassistenz  2005 21537
## 5 Krankenpflegeassistenz  2007 27731
## 6 Krankenpflegeassistenz  2009 36481