Dplyr mutate(): Spalten (Variablen) erstellen

Mit mutate() werden neue Variablen erstellt. Die Funktion fügt die neuen Variablen zu den bestehenden hinzu. Sie können mutate() auch verwenden, um bestehende Variablen zu ändern.

Die Funktion transmute() erstellt ebenfalls Variablen, entfernt jedoch alle anderen Variablen, die in transmute() weder erstellt noch genannt werden.

Um Variablen mit mutate() zu erstellen oder zu ändern, geben Sie den Namen der Variablen (die erstellt oder geändert werden soll) an, gefolgt von der Definition der Variablen. Im folgenden Beispiel wird die Variable ny_variabel erstellt, indem cyl mit 2 multipliziert wird:

mpg |>
  mutate(ny_variabel = cyl*2)
cyl         ny_variabel
4           8
4           8
4           8
4           8
6          12

Sie können mit mutate() mehrere neue Variablen gleichzeitig erstellen, indem Sie die Variablen durch Kommas trennen. Sie können auch Variablen verwenden, die gerade erst erstellt wurden. Im folgenden Beispiel wird ny_variabel erstellt und anschließend direkt verwendet, um ny_variabel2 zu erstellen.

mpg |>
  mutate(ny_variabel  = cyl*2,
         ny_variabel2 = ny_variabel^2)
cyl     ny_variabel  ny_variabel2
4       8            64
4       8            64
4       8            64
4       8            64
6       12           144

Die Funktion case_when() kann verwendet werden, um eine Variable auf Grundlage von Bedingungen zu erstellen. Das ist effizienter als die Funktion ifelse(), die häufig zu umständlichem Code führt. Unten wird die Variable ny_variabel auf Grundlage der Information in der Variablen displ erstellt. Ist displ <2, wird ny_variabel gleich 0. Ist displ <3, wird ny_variabel gleich 1. Ist displ >3, wird ny_variabel gleich 2.

mpg |> mutate(ny_variabel = case_when(displ < 2 ~ 0,
                                      displ < 3 ~ 1,
                                      displ > 3 ~ 2))
## A tibble: 234 × 2
displ ny_variabel
1.8           0
1.8           0
2             1
2             1
2.8           1
2.8           1
3.1           2
1.8           0
1.8           0
2             1

Sie können case_when() verwenden, um kategoriale Variablen mit Zeichenketten zu erstellen:

mpg |> mutate(ny_variabel = case_when(displ < 2 ~ 'Lite',
                                      displ < 3 ~ 'Lagom',
                                      displ > 3 ~ 'Mycket'))
## A tibble: 234 × 2
displ ny_variabel
1.8   Lite
1.8   Lite
2     Lagom
2     Lagom
2.8   Lagom
2.8   Lagom
3.1   Mycket
1.8   Lite
1.8   Lite
2     Lagom

across()

Die Funktion across() ermöglicht es, mutate() auf viele Spalten gleichzeitig anzuwenden. Die Funktion ist nützlich, um Änderungen an vielen bestehenden Variablen gleichzeitig vorzunehmen. Die Funktion mutate() wird mit <tidy-select> kombiniert, also mit Funktionen, die Spalten sehr effizient auswählen. Ein Beispiel für <tidy-select> ist everything(), das "alle Variablen" bedeutet.

Um across zu demonstrieren, erstellen wir mit der Funktion tibble() einen neuen Data Frame:

my_data <-
  tibble(var1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
         var2 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"),
         var3 = c(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000))

my_data
var1  var2   var3
1     a       100
2     b       200
3     c       300
4     d       400
5     e       500
6     f       600
7     g       700
8     h       800
9     i       900
10    j      1000

Es gibt zwei numerische Spalten (var1, var3), deren Quadratwurzel wir nun berechnen wollen. Die Quadratwurzel wird mit der Funktion sqrt berechnet. Die Spalten var1 und var3 sind die Spalten Nummer 1 und 3. Die folgenden Befehle sind gleichwertig:

## Quadratwurzel von var1 und var3
my_data %>%
  mutate(across(c(var1, var3), sqrt))

## Wie oben, aber nun mit dem Index der Spalten
my_data %>%
  mutate(across(c(1, 3), sqrt))
var1  var2   var3
1     a      10
1.41  b      14.1
1.73  c      17.3
2     d      20
2.24  e      22.4
2.45  f      24.5
2.65  g      26.5
2.83  h      28.3
3     i      30
3.16  j      31.6

Wie oben zu sehen, werden die bestehenden Spalten ersetzt. Wenn die Funktion neue Spalten erstellen soll, verwenden wir das Argument .names, mit dem wir ein Suffix oder Präfix für die neuen Spalten festlegen können:

## Quadratwurzel von var1 und var3.
## Neue Spalten erhalten das Suffix "_kvadratrot"
my_data %>%
  mutate(across(c(1, 3), sqrt, .names="{col}_kvadratrot"))
    var1 var2   var3     var1_kvadratrot   var3_kvadratrot
       1 a       100            1               10
       2 b       200            1.41            14.1
       3 c       300            1.73            17.3
       4 d       400            2               20
       5 e       500            2.24            22.4
       6 f       600            2.45            24.5
       7 g       700            2.65            26.5
       8 h       800            2.83            28.3
       9 i       900            3               30
       10 j      1000            3.16            31.6

Komplexere Funktionen lassen sich mit der Tilde (~) definieren, wobei der aktuelle Wert in jeder Zeile durch den Platzhalter .x dargestellt wird. Im nächsten Beispiel wählen wir alle numerischen Spalten aus, quadrieren den Wert und speichern ihn in einer neuen Spalte mit dem Präfix "ny_":

## Numerische Spalten auswählen, quadrieren, Ergebnis in neuen Spalten mit dem Präfix "ny_" speichern
my_data %>%
  mutate(across(where(is.numeric), ~ .x^2, .names = "ny_{col}"))
## A tibble: 10 × 5
    var1 var2   var3 ny_var1 ny_var3
   <dbl> <chr> <dbl>   <dbl>   <dbl>
 1     1 a       100       1   10000
 2     2 b       200       4   40000
 3     3 c       300       9   90000
 4     4 d       400      16  160000
 5     5 e       500      25  250000
 6     6 f       600      36  360000
 7     7 g       700      49  490000
 8     8 h       800      64  640000
 9     9 i       900      81  810000
10    10 j      1000     100 1000000

Im Folgenden werden mutate() und across() mit Mustervergleichen auf den Zeichenketten der Variablennamen gezeigt:

Hier werden Spalten verändert, die das Zeichen "1" enthalten:

## Verändert Spalten, deren Spaltenname die Ziffer 1 enthält
my_data %>%
  mutate(across(matches('1'), ~ .x^2, .names = "ny_{col}"))
## A tibble: 10 × 4
    var1 var2   var3 ny_var1
   <dbl> <chr> <dbl>   <dbl>
 1     1 a       100       1
 2     2 b       200       4
 3     3 c       300       9
 4     4 d       400      16
 5     5 e       500      25
 6     6 f       600      36
 7     7 g       700      49
 8     8 h       800      64
 9     9 i       900      81
10    10 j      1000     100

Hier werden Spalten verändert, die auf das Zeichen "3" enden:

## Verändert Spalten, die auf das Zeichen 3 enden
my_data %>%
  mutate(across(ends_with('3'), ~ .x^2, .names = "ny_{col}"))
## A tibble: 10 × 4
    var1 var2   var3 ny_var3
   <dbl> <chr> <dbl>   <dbl>
 1     1 a       100   10000
 2     2 b       200   40000
 3     3 c       300   90000
 4     4 d       400  160000
 5     5 e       500  250000
 6     6 f       600  360000
 7     7 g       700  490000
 8     8 h       800  640000
 9     9 i       900  810000
10    10 j      1000 1000000