11 Data Wrangling III
11.1 Datensätze verbinden
A mutating join allows you to combine variables from two tables. It first matches observations by their keys, then copies across variables from one table to the other.
R for Data Science: Mutating joins
Ein Überblick zu den wichtigsten Befehlen:1
Es gibt natürlich auch right_join()
oder anti_join()
. Für eine tiefergehende Einführung lohnt sich das Kapitel Relational Data aus R for Data Science.
Eine sehr hilfreiche Option in den ..._join()
ist die Verbindung unterschiedlicher Variablen. Bspw. haben wir hier einige Fälle aus der ETB18 und
Code
<- haven::read_dta("./data/BIBBBAuA_2018_suf1.0.dta",
etb18_int_bl col_select = c("intnr","Bula") # mit col_select() können Variablen ausgewählt werden
)
<- etb18_int_bl %>% slice(c(1,125,1230,21010,8722) )
etb_ids
set.seed(90459)
<- data.frame(bundesland = seq(1:8),
alo_bula Werte = sample(letters,size = 8) # mit sample() kann eine zufällige Auswahl getroffen werden
)
etb_ids
#> # A tibble: 4 × 2
#> intnr Bula
#> <dbl> <dbl+lbl>
#> 1 260 11 [Berlin]
#> 2 30699 5 [Nordrhein-Westfalen]
#> 3 209604 6 [Hessen]
#> 4 1540064 8 [Baden-Württemberg]
alo_bula
#> bundesland Werte
#> 1 1 g
#> 2 2 m
#> 3 3 n
#> 4 4 z
#> 5 5 w
#> 6 6 r
#> 7 7 t
#> 8 8 h
%>% left_join(alo_bula,by = c("Bula"="bundesland")) etb_ids
#> # A tibble: 4 × 3
#> intnr Bula Werte
#> <dbl> <dbl+lbl> <chr>
#> 1 260 11 [Berlin] <NA>
#> 2 30699 5 [Nordrhein-Westfalen] w
#> 3 209604 6 [Hessen] r
#> 4 1540064 8 [Baden-Württemberg] h
Ein sehr hilfreiche Checkmöglichkeit, die ich häufig verwende: Für alle Bula
in etb_ids
findet sich eine Entsprechung in alo$bundesland
:
table(etb_ids$Bula %in% alo_bula$bundesland)
#>
#> FALSE TRUE
#> 1 3
11.1.1 Übung
11.2 Reshape: pivot_longer()
& pivot_wider()
<-
bsp_df data.frame(
bula = c("NRW","NDS"),
alo2018 = c(2,2),
alo2017 = c(1,1)
)
bsp_df
#> bula alo2018 alo2017
#> 1 NRW 2 1
#> 2 NDS 2 1
Mit pivot_longer()
können wir aus einem wide shape data.frame
einen long shape machen:
%>% pivot_longer(cols = c("alo2018","alo2017"),names_to = "year",values_to = "alo") bsp_df
#> # A tibble: 4 × 3
#> bula year alo
#> <chr> <chr> <dbl>
#> 1 NRW alo2018 2
#> 2 NRW alo2017 1
#> 3 NDS alo2018 2
#> 4 NDS alo2017 1
Mit names_prefix = "alo"
können wir das alo
direkt löschen lassen:
%>% pivot_longer(cols = c("alo2018","alo2017"),names_to = "year",values_to = "alo",names_prefix = "alo") bsp_df
#> # A tibble: 4 × 3
#> bula year alo
#> <chr> <chr> <dbl>
#> 1 NRW 2018 2
#> 2 NRW 2017 1
#> 3 NDS 2018 2
#> 4 NDS 2017 1
Mit pivot_wider()
können wir den umgekehrten Weg gehen:
<-
bsp_df2 data.frame(land = c("NRW","NDS","NRW","NDS"),
alo = c(2.1,1.8,2.4,2.2),
alter = c("age_1825","age_1825","age_2630","age_2630"))
bsp_df2
#> land alo alter
#> 1 NRW 2.1 age_1825
#> 2 NDS 1.8 age_1825
#> 3 NRW 2.4 age_2630
#> 4 NDS 2.2 age_2630
%>% pivot_wider(names_from = alter,values_from = alo) bsp_df2
#> # A tibble: 2 × 3
#> land age_1825 age_2630
#> <chr> <dbl> <dbl>
#> 1 NRW 2.1 2.4
#> 2 NDS 1.8 2.2
11.3 Übungen
11.3.1 Übung 1
Verknüpfen Sie die ausgewählten Beobachtungen der ETB 2018 mit Arbeitsmarktstatistiken von Destatis. Lesen die ETB mit folgendem Befehl ein:
<- haven::read_dta("./data/BIBBBAuA_2018_suf1.0.dta",
etb_ue11 col_select = c("intnr","int_jahr","Bula")) %>%
slice(34:35,68:69,62,687,625,684,599:600)
etb_ue11
#> # A tibble: 10 × 3
#> intnr int_jahr Bula
#> <dbl> <dbl> <dbl+lbl>
#> 1 7045 2017 3 [Niedersachsen]
#> 2 7119 2017 3 [Niedersachsen]
#> 3 15443 2017 5 [Nordrhein-Westfalen]
#> 4 15527 2017 5 [Nordrhein-Westfalen]
#> 5 13619 2018 3 [Niedersachsen]
#> 6 104699 2018 3 [Niedersachsen]
#> 7 94148 2018 5 [Nordrhein-Westfalen]
#> 8 103957 2018 5 [Nordrhein-Westfalen]
#> 9 87426 2017 1 [Schleswig-Holstein]
#> 10 87648 2017 6 [Hessen]
So können Sie die aufbereiteten Arbeitslosendaten einlesen (die Zahlencodes in beiden Datensätzen stimmen überein):
<- readRDS(file = "./data/alo_bula1.Rdata")
alo alo
#> # A tibble: 2 × 3
#> ags name aloquote
#> <dbl> <chr> <chr>
#> 1 3 Niedersachsen 5.8
#> 2 5 Nordrhein-Westfalen 7.4
Wie müssten Sie vorgehen, wenn Sie nun jahresgenaue Angaben haben und dementsprechend zusätzlich auch nach dem Jahr mergen möchten?
<- readRDS(file = "./data/alo_bula1_jahr.Rdata")
alo_j alo_j
#> # A tibble: 4 × 4
#> ags name aloquote jahr
#> <dbl> <chr> <chr> <dbl>
#> 1 3 Niedersachsen 5.8 2017
#> 2 5 Nordrhein-Westfalen 7.4 2017
#> 3 3 Niedersachsen 5.3 2018
#> 4 5 Nordrhein-Westfalen 6.8 2018
11.3.2 Übung 2
<- readRDS(file = "./data/alo_bula2.Rdata")
alo_wide alo_wide
#> # A tibble: 2 × 4
#> ags name alo_2017 alo_2018
#> <chr> <chr> <chr> <chr>
#> 1 03 Niedersachsen 5.8 5.3
#> 2 05 Nordrhein-Westfalen 7.4 6.8
Bringen Sie alo_wide
in das long shape:
#> # A tibble: 4 × 4
#> ags name jahr alo_quote
#> <chr> <chr> <chr> <chr>
#> 1 03 Niedersachsen 2017 5.8
#> 2 03 Niedersachsen 2018 5.3
#> 3 05 Nordrhein-Westfalen 2017 7.4
#> 4 05 Nordrhein-Westfalen 2018 6.8
Illustrationen mit tidyexplain↩︎