Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


r:tidyverse:dplyr_mutate

Questa è una vecchia versione del documento!


mutate, transmute (dplyr)

mutate() aggiunge nuove variabili ad un dataset, indicandone il nome e il valore, in questo modo.

  mutate(dataset, nuova_variabile = ...)

oppure

  dataset %>% 
    mutate(nuova_variabile = ...)

Ricodifica con mutate()

La funzione può essere usata per aggiungere un vettore di valori, o un vettore (nuova variabile) risultato della trasformazione di un’altra variabile. È dunque una funzione fondamentale per le operazioni di ricodifica. Ad esempio:

library(tidyverse)
starwars %>%
  # selezioniamo due sole variabili per visualizzare meglio i risultati
  select(name, mass) %>%
  # creiamo la variabile "mass_norm"
  mutate(mass_norm = mass / mean(mass, na.rm = TRUE))
# A tibble: 87 x 3
   name                mass mass_norm
   <chr>              <dbl>     <dbl>
 1 Luke Skywalker        77     0.791
 2 C-3PO                 75     0.771
 3 R2-D2                 32     0.329
 4 Darth Vader          136     1.40 
 5 Leia Organa           49     0.504
 6 Owen Lars            120     1.23 
 7 Beru Whitesun lars    75     0.771
 8 R5-D4                 32     0.329
 9 Biggs Darklighter     84     0.863
10 Obi-Wan Kenobi        77     0.791
# ... with 77 more rows

Oppure, per riprendere l'esempio in Calcolare una nuova variabile, creiamo la variabile Totale (della popolazione) sommando Totale.Maschi e Totale.Femmine, nel dataset Istat16 (scaricabile in formato rda qui)):

library(tidyverse)
mutate(Istat16, Totale = Totale.Maschi + Totale.Femmine)

Applicando altre altre funzioni

Generalmente, la ricodifica richiede l'uso di altre funzioni, all'interno di mutate(). In questo caso, si scriverà:

dataset %>% 
  mutate(nuova_variabile = fct_recode(vecchia_variabile, ...))

e non

dataset %>% 
  fct_recode(vecchia_variabile, ...)

Quindi, ad esempio:

starwars <- starwars %>% 
  mutate(sex = as.factor(sex))

equivale a:

starwars$sex <- as.factor(starwars$sex)

Mentre è scorretto:

starwars %>% 
  as.factor(sex)

Con variabile di raggruppamento

I valori della nuova variabile possono essere specificati in base ad una variabile di raggruppamento: ad esempio il valore normalizzato della massa può essere calcolato nei gruppi definiti dalla variabile “homeworld”, usando group_by()

starwars %>%
  select(name, mass, homeworld) %>%
  group_by(homeworld) %>%
  mutate(mass_norm = mass / mean(mass, na.rm = TRUE))
# A tibble: 87 x 4
# Groups:   homeworld [49]
   name                mass homeworld mass_norm
   <chr>              <dbl> <chr>         <dbl>
 1 Luke Skywalker        77 Tatooine      0.902
 2 C-3PO                 75 Tatooine      0.878
 3 R2-D2                 32 Naboo         0.499
 4 Darth Vader          136 Tatooine      1.59 
 5 Leia Organa           49 Alderaan      0.766
 6 Owen Lars            120 Tatooine      1.41 
 7 Beru Whitesun lars    75 Tatooine      0.878
 8 R5-D4                 32 Tatooine      0.375
 9 Biggs Darklighter     84 Tatooine      0.984
10 Obi-Wan Kenobi        77 Stewjon       1    
# ... with 77 more rows

transmute()

Con mutate(), la variabile viene direttamente aggiunta al dataset.

Con transmute(), la nuova variabile sostituisce invece la o le variabili precedenti. Si consideri l'esempio:

es_mutate.R
# costruiamo le variabili standardizzate
mutate(cars, zspeed = as.numeric(scale(speed)),
       zdist = as.numeric(scale(speed))) %>% 
  as_tibble()                                         # per visualizzare
# A tibble: 50 x 4
   speed  dist zspeed  zdist
   <dbl> <dbl>  <dbl>  <dbl>
 1     4     2 -2.16  -2.16 
 2     4    10 -2.16  -2.16 
 3     7     4 -1.59  -1.59 
 4     7    22 -1.59  -1.59 
 5     8    16 -1.40  -1.40 
 6     9    10 -1.21  -1.21 
 7    10    18 -1.02  -1.02 
 8    10    26 -1.02  -1.02 
 9    10    34 -1.02  -1.02 
10    11    17 -0.832 -0.832
# ... with 40 more rows
es_transmute.R
library(tidyverse)
 
# nuovo file
zcars <- transmute(cars, zspeed = as.numeric(scale(speed)),
                   zdist = as.numeric(scale(speed)))
as_tibble(zcars)                               
# A tibble: 50 x 2
   zspeed  zdist
    <dbl>  <dbl>
 1 -2.16  -2.16 
 2 -2.16  -2.16 
 3 -1.59  -1.59 
 4 -1.59  -1.59 
 5 -1.40  -1.40 
 6 -1.21  -1.21 
 7 -1.02  -1.02 
 8 -1.02  -1.02 
 9 -1.02  -1.02 
10 -0.832 -0.832
# ... with 40 more rows

Vedi RDocumentation: mutate

Domande? Scrivimi

Messenger Telegram Email
r/tidyverse/dplyr_mutate.1754838648.txt.gz · Ultima modifica: 10/08/2025 15:10 da Agnese Vardanega