Data Pivoting

Dieselben Daten derselben Merkmalsträger in denselben Variablen können in unterschiedlichen Datensätzen resultieren:

ID bill_length bill_depth
A 39.4 18.2
B 37.6 17.9
ID bill_variable bill_value
A bill_depth 18.2
B bill_depth 17.9
A bill_length 39.4
B bill_length 37.6

Das führt oft dazu, dass Daten in einem anderen Format vorliegen, als sie für ein Wrangling, eine Visualisierung oder eine statistische Modellierung benötigt werden. Dementsprechend ist es hilfreich, das Format ändern zu können. Dies kann sehr komplex werden - im folgenden betrachten wir eher einfache Minimalbeispiele.

Beispiel 1: bill-Variablen

TippBeispielstudie

Angenommen ein Forscher:innenteam möchte Mittelwert und Standardabweichungen aller bill Variablen getrennt nach species und sex haben. Was wäre eine geeignete Syntax?

Lägen die Daten wie in der Tabelle 1 (rechts) vor, könnte man einen Spilt-Apply-Combine-Approach mit group_by(sepcies, sex, billvariable) anwenden.

Tabelle 1: Tabelle für Split-Apply-Combine
species sex bill_variable bill_value
Adelie male bill_depth 18.2
Chinstrap male bill_depth 17.9
Chinstrap male bill_length 39.4
Gentoo female bill_length 37.6

Ein Format wie in Tabelle 1 erhält man durch folgende Syntax:

penguins %>% 
  select(sex, species, bill_length_mm, bill_depth_mm) %>% 
  pivot_longer(names_to = "bill_variable",
               values_to = "bill_value",
               cols = c(bill_length_mm, bill_depth_mm))
# A tibble: 688 × 4
   sex    species bill_variable  bill_value
   <fct>  <fct>   <chr>               <dbl>
 1 male   Adelie  bill_length_mm       39.1
 2 male   Adelie  bill_depth_mm        18.7
 3 female Adelie  bill_length_mm       39.5
 4 female Adelie  bill_depth_mm        17.4
 5 female Adelie  bill_length_mm       40.3
 6 female Adelie  bill_depth_mm        18  
 7 <NA>   Adelie  bill_length_mm       NA  
 8 <NA>   Adelie  bill_depth_mm        NA  
 9 female Adelie  bill_length_mm       36.7
10 female Adelie  bill_depth_mm        19.3
# ℹ 678 more rows

Die Berechnung der gewünschten MW und SD kann nun folgen:

penguins %>% 
  select(sex, species, bill_length_mm, bill_depth_mm) %>% 
  pivot_longer(names_to = "bill_variable",
               values_to = "bill_value",
               cols = c(bill_length_mm, bill_depth_mm)) %>% 
  group_by(sex, species, bill_variable) %>% 
  summarize(means = mean(bill_value, na.rm = T),
            sds = sd(bill_value, na.rm = T))
`summarise()` has grouped output by 'sex', 'species'. You can override using
the `.groups` argument.
# A tibble: 16 × 5
# Groups:   sex, species [8]
   sex    species   bill_variable  means   sds
   <fct>  <fct>     <chr>          <dbl> <dbl>
 1 female Adelie    bill_depth_mm   17.6 0.943
 2 female Adelie    bill_length_mm  37.3 2.03 
 3 female Chinstrap bill_depth_mm   17.6 0.781
 4 female Chinstrap bill_length_mm  46.6 3.11 
 5 female Gentoo    bill_depth_mm   14.2 0.540
 6 female Gentoo    bill_length_mm  45.6 2.05 
 7 male   Adelie    bill_depth_mm   19.1 1.02 
 8 male   Adelie    bill_length_mm  40.4 2.28 
 9 male   Chinstrap bill_depth_mm   19.3 0.761
10 male   Chinstrap bill_length_mm  51.1 1.56 
11 male   Gentoo    bill_depth_mm   15.7 0.741
12 male   Gentoo    bill_length_mm  49.5 2.72 
13 <NA>   Adelie    bill_depth_mm   18.3 1.27 
14 <NA>   Adelie    bill_length_mm  37.8 2.80 
15 <NA>   Gentoo    bill_depth_mm   14.6 0.810
16 <NA>   Gentoo    bill_length_mm  45.6 1.37 

Übung 1: Längsschnittliche Daten

TippBeispielstudie

Angenommen ein Forscher:innenteam erhebt zu zwei Zeitpunkten das Mathamatikselbstkonzept sowie die Mathematikleistung in den folgenden beiden Datensätzen.

Tabelle 2: Datensatz data_mathe_t1
ID selbst_t1 mleist_t1
A 5.3 532
B 6.1 610
C 4.8 480
Tabelle 3: Datensatz data_mathe_t2
ID selbst_t2 mleist_t2
A 5.0 562
B 5.7 652
C 4.2 489

Es möchte nun MW SD je Variable und je Zeitpunkt sowie die Korrelation von Selbstkonzept und Leistung sowohl je Zeitpunkt als auch über beide Zeitpunkte hinweg berechnen.

In folgendem Codefenster sind die beiden Datensätze data_mathe_t1 und data_mathe_t2 als ebenso benannte Objekte hinterlegt. Führen Sie einen geeigneten Join durch und berechnen Sie die oben genannten MW, SD und Korrelationen.

HinweisHinweis:
  • Für die Berechnung der MW und SD kann man schlicht alle Variablen außer ID in pivot_longer() an das Argument cols = übergeben und dann einen Split-Apply-Combine Ansatz fahren.
  • Für die Berechnung einer Korrelation macht es im {tidyverse} Sinn, der Base-R-Funktion cor() einen slektierten Datensatz via Pipeoperator %>% zu übergeben.
  • Der cor() Funktion kann mit dem Argument use = pairwise signalisiert werden, dass es paarweise vollständige Beobachtungen in die Berechnung miteinbeziehen soll (fallweiser Ausschluss von fehlenden Werten).
TippEine Lösung
# MW und SD
full_join(data_mathe_t1, data_mathe_t2) %>% 
  pivot_longer(names_to = "variablen",
               values_to = "werte",
               cols = -ID) %>% 
  group_by(variablen) %>% 
  summarize(means = mean(werte, na.rm = T),
            sd = sd(werte, na.rm = T))

# Korrelation t1
data_mathe_t1 %>% 
  select(selbst_t1, mleist_t1) %>% 
  cor(use = "pairwise")

# Korrelation t2
data_mathe_t2 %>% 
  select(selbst_t2, mleist_t2) %>% 
  cor(use = "pairwise")

# Korrelation gesamt
full_join(data_mathe_t1, data_mathe_t2) %>% 
  pivot_longer(names_to = "variablen",
               values_to = "werte",
               cols = -ID) %>% 
  mutate(time = substr(variablen, 8, 9),
         variablen = substr(variablen, 1, 6)) %>% 
  pivot_wider(values_from = "werte",
              names_from = "variablen") %>% 
  select(selbst, mleist) %>% 
  cor(use = "pairwise")

Cheat Sheet {tidyr}

https://rstudio.github.io/cheatsheets/

https://rstudio.github.io/cheatsheets/