Glossary Funktionen dplyr

02.05.2019 - Valentin Gold - Reading time ~5 Minutes


Glossary für einige der dplyr-Funktionen

Diese Seite bietet einen kurzen Überblick über relevante Funktionen aus dem Paket dplyr (in Kombination mit magrittr). Eine stärker angewandte Einführung finden Sie unter dem Titel “Einführung in R”. Der Unterschied ist, dass hier ein wesentlich kleinerer und fikitiver Datensatz zur Demonstration der Befehle herangezogen wird, so dass die Funktionsweise der Befehle schnell ersichtlich wird. Das Einführungsbuch https://www.tidytextmining.com/ bietet ebenfalls einen guten angewandten Überblick und vermittelt weitere Kenntnisse für viele der hier angesprochenen Funktionen.

Alle Beispiele werden auf den folgenden fiktiven Datensatz angewandt:

library(tibble)
bsp <- tibble(id = c(1, 2, 3, 4, 5, 6, 7), 
              group = c("a", "a", "b", "c", "c", "c", "c"), 
              value = c(2, 4, 7, 3, 5, NA, 4))
bsp
## # A tibble: 7 x 3
##      id group value
##   <dbl> <chr> <dbl>
## 1     1 a         2
## 2     2 a         4
## 3     3 b         7
## 4     4 c         3
## 5     5 c         5
## 6     6 c        NA
## 7     7 c         4

Pakete laden

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(magrittr)

select()

bsp %>% 
  select(value)
## # A tibble: 7 x 1
##   value
##   <dbl>
## 1     2
## 2     4
## 3     7
## 4     3
## 5     5
## 6    NA
## 7     4

pull()

bsp %>% 
  pull(value)
## [1]  2  4  7  3  5 NA  4

filter()

bsp %>% 
  filter(value < 4 & !is.na(value))
## # A tibble: 2 x 3
##      id group value
##   <dbl> <chr> <dbl>
## 1     1 a         2
## 2     4 c         3

arrange()

bsp %>% 
  arrange(value, group)
## # A tibble: 7 x 3
##      id group value
##   <dbl> <chr> <dbl>
## 1     1 a         2
## 2     4 c         3
## 3     2 a         4
## 4     7 c         4
## 5     5 c         5
## 6     3 b         7
## 7     6 c        NA

distinct()

bsp %>% 
  distinct(group)
## # A tibble: 3 x 1
##   group
##   <chr>
## 1 a    
## 2 b    
## 3 c

count()

bsp %>% 
  count(group)
## # A tibble: 3 x 2
##   group     n
##   <chr> <int>
## 1 a         2
## 2 b         1
## 3 c         4

summarise()

bsp %>% 
  summarise(mean_value = mean(value, na.rm = TRUE))
## # A tibble: 1 x 1
##   mean_value
##        <dbl>
## 1       4.17

mutate()

bsp %>% 
  mutate(mean_value = mean(value, na.rm = TRUE))
## # A tibble: 7 x 4
##      id group value mean_value
##   <dbl> <chr> <dbl>      <dbl>
## 1     1 a         2       4.17
## 2     2 a         4       4.17
## 3     3 b         7       4.17
## 4     4 c         3       4.17
## 5     5 c         5       4.17
## 6     6 c        NA       4.17
## 7     7 c         4       4.17

group_by() \(\&\) summarise()

bsp %>% 
  group_by(group) %>% 
  summarise(mean_value = mean(value, na.rm = TRUE))
## # A tibble: 3 x 2
##   group mean_value
##   <chr>      <dbl>
## 1 a              3
## 2 b              7
## 3 c              4

group_by() \(\&\) mutate()

bsp %>% 
  group_by(group) %>% 
  mutate(mean_value = mean(value, na.rm = TRUE))
## # A tibble: 7 x 4
## # Groups:   group [3]
##      id group value mean_value
##   <dbl> <chr> <dbl>      <dbl>
## 1     1 a         2          3
## 2     2 a         4          3
## 3     3 b         7          7
## 4     4 c         3          4
## 5     5 c         5          4
## 6     6 c        NA          4
## 7     7 c         4          4

mutate() \(\&\) case_when()

bsp %>% 
  mutate(mean_value = case_when(
    group == "a" ~ mean(value, na.rm = TRUE), 
    TRUE ~ NA_real_
  ))
## # A tibble: 7 x 4
##      id group value mean_value
##   <dbl> <chr> <dbl>      <dbl>
## 1     1 a         2       4.17
## 2     2 a         4       4.17
## 3     3 b         7      NA   
## 4     4 c         3      NA   
## 5     5 c         5      NA   
## 6     6 c        NA      NA   
## 7     7 c         4      NA

Merke: Die erste Angabe auf der rechten Seite der Gleichung (also nach dem Tilde-Symbol “~”) bestimmt den Datentyp und entscheidet damit, welches NA gesetzt werden muss.

Kombination verschiedener Befehle, z.B.

bsp %>% #Ausgangsdatensatz
  group_by(group) %>% #Gruppierung
  mutate(freq_group = n()) %>% #Häufigkeit der Gruppen
  mutate(mean_value = case_when( #neue Variable, wenn
    freq_group > 1 ~ mean(value, na.rm = TRUE), #wenn Bedingung, dann Mittelwert
    TRUE ~ NA_real_ #wenn keine Bedingung zutrifft, dann NA
  )) %>% 
  arrange(freq_group, desc(value)) #Sortierung aufsteigend und absteigend
## # A tibble: 7 x 5
## # Groups:   group [3]
##      id group value freq_group mean_value
##   <dbl> <chr> <dbl>      <int>      <dbl>
## 1     3 b         7          1         NA
## 2     2 a         4          2          3
## 3     1 a         2          2          3
## 4     5 c         5          4          4
## 5     7 c         4          4          4
## 6     4 c         3          4          4
## 7     6 c        NA          4          4
bsp %>% #Ausgangsdatensatz
  group_by(group) %>% #Gruppierung
  mutate(value = case_when( #Rekodierung, wenn
    is.na(value) ~ 0, #wenn Bedingung, dann
    TRUE ~ value #wenn keine Bedingung zutrifft, dann Wert beibehalten
  )) %>% 
  arrange(group, value) %>% #Sortierung
  mutate(cum_value = cumsum(value)) #kumulierte Summe
## # A tibble: 7 x 4
## # Groups:   group [3]
##      id group value cum_value
##   <dbl> <chr> <dbl>     <dbl>
## 1     1 a         2         2
## 2     2 a         4         6
## 3     3 b         7         7
## 4     6 c         0         0
## 5     4 c         3         3
## 6     7 c         4         7
## 7     5 c         5        12
bsp %>% #Ausgangsdatensatz
  mutate(mean_value = mean(value, na.rm = TRUE)) %>% #neue Variable 
  mutate(abw_vom_mittelwert = value - mean_value) %>% #neue Variable 
  mutate(abw_pos = case_when( #neue Variable, wenn
    abw_vom_mittelwert > 0 ~ "Abweichung positiv", #wenn Bedingung, dann
    abw_vom_mittelwert < 0 ~ "Abweichung negativ"  #wenn Bedingung, dann
  )) %>% 
  group_by(abw_pos) %>% #Gruppierung nach Abweichung pos oder neg
  summarise(mean_abw_pos_neg = mean(abs(abw_vom_mittelwert))) %>% #durchschnittliche Abweichung pro Gruppe
  filter(!is.na(abw_pos)) #Rausfiltern von NA
## # A tibble: 2 x 2
##   abw_pos            mean_abw_pos_neg
##   <chr>                         <dbl>
## 1 Abweichung negativ            0.917
## 2 Abweichung positiv            1.83