dplyr - Manipolazione Dati in R
dplyr e’ il pacchetto piu’ importante del tidyverse, l’ecosistema di pacchetti R creato da Hadley Wickham per la manipolazione e l’analisi dei dati. Con dplyr si possono eseguire le operazioni piu’ comuni sui dati in modo leggibile, efficiente e concatenabile grazie all’operatore pipe %>%. In questa guida esploreremo tutte le funzioni principali di dplyr con esempi pratici.
Installazione e Caricamento
Per utilizzare dplyr, occorre prima installarlo e poi caricarlo nella sessione R.
# Installazione del pacchetto (solo la prima volta)
install.packages("dplyr")
# Caricamento nella sessione
library(dplyr)
In alternativa, si puo’ installare l’intero tidyverse, che include dplyr insieme ad altri pacchetti utili come tidyr, ggplot2 e readr.
install.packages("tidyverse")
library(tidyverse)
L’Operatore Pipe %>%
L’operatore pipe %>% e’ il cuore della sintassi dplyr. Permette di concatenare piu’ operazioni passando il risultato di una funzione come primo argomento della successiva, rendendo il codice molto piu’ leggibile.
# Senza pipe: difficile da leggere
arrange(filter(select(mtcars, mpg, cyl, hp), cyl == 6), desc(mpg))
# Con pipe: chiaro e leggibile
mtcars %>%
select(mpg, cyl, hp) %>%
filter(cyl == 6) %>%
arrange(desc(mpg))
# mpg cyl hp
# Mazda RX4 21.0 6 110
# Mazda RX4 Wag 21.0 6 110
# Hornet 4 Drive 21.4 6 110
# ...
A partire da R 4.1, esiste anche il pipe nativo |> che funziona in modo simile, ma %>% resta lo standard nel tidyverse.
select() - Selezionare Colonne
La funzione select() permette di scegliere quali colonne mantenere in un dataframe.
# Selezionare colonne specifiche
mtcars %>%
select(mpg, cyl, hp) %>%
head(3)
# mpg cyl hp
# Mazda RX4 21.0 6 110
# Mazda RX4 Wag 21.0 6 110
# Datsun 710 22.8 4 93
# Escludere colonne con il segno meno
mtcars %>%
select(-disp, -drat, -vs, -am, -gear, -carb) %>%
head(3)
# Selezionare colonne per intervallo
mtcars %>%
select(mpg:hp) %>%
head(3)
# Selezionare con helper functions
mtcars %>%
select(starts_with("d")) %>% # colonne che iniziano con "d"
head(3)
# disp drat
# Mazda RX4 160 3.90
# Mazda RX4 Wag 160 3.90
# Datsun 710 108 3.85
Le helper functions disponibili includono starts_with(), ends_with(), contains(), matches() e everything().
filter() - Filtrare Righe
filter() seleziona le righe che soddisfano una o piu’ condizioni logiche.
# Filtrare auto con 6 cilindri
mtcars %>%
filter(cyl == 6)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# ...
# Condizioni multiple con AND (virgola o &)
mtcars %>%
filter(cyl == 6, mpg > 20)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# Condizioni con OR
mtcars %>%
filter(cyl == 4 | cyl == 8) %>%
head(4)
# Usare %in% per valori multipli
mtcars %>%
filter(cyl %in% c(4, 8)) %>%
head(4)
mutate() - Creare o Modificare Colonne
mutate() aggiunge nuove colonne o modifica quelle esistenti.
# Aggiungere una nuova colonna
mtcars %>%
mutate(kpl = mpg * 0.425144) %>%
select(mpg, kpl) %>%
head(4)
# mpg kpl
# Mazda RX4 21.0 8.928024
# Mazda RX4 Wag 21.0 8.928024
# Datsun 710 22.8 9.693283
# Hornet 4 Drive 21.4 9.094082
# Creare piu' colonne contemporaneamente
mtcars %>%
mutate(
peso_kg = wt * 453.592,
potenza_kw = hp * 0.7457,
rapporto = hp / wt
) %>%
select(wt, peso_kg, hp, potenza_kw, rapporto) %>%
head(3)
# wt peso_kg hp potenza_kw rapporto
# Mazda RX4 2.620 1188.411 110 82.027 41.98473
# Mazda RX4 Wag 2.875 1303.452 110 82.027 38.26087
# Datsun 710 2.320 1052.333 93 69.350 40.08621
# transmute() mantiene solo le colonne create
mtcars %>%
transmute(
consumo_litri = mpg * 0.425144,
cilindri = cyl
) %>%
head(3)
arrange() - Ordinare i Dati
arrange() ordina le righe in base a una o piu’ colonne. L’ordine predefinito e’ crescente; per ottenere l’ordine decrescente si usa desc().
# Ordinare per consumo crescente
mtcars %>%
select(mpg, cyl, hp) %>%
arrange(mpg) %>%
head(5)
# mpg cyl hp
# Cadillac Fleetwood 10.4 8 205
# Lincoln Continental 10.4 8 215
# Camaro Z28 13.3 8 245
# Duster 360 14.3 8 245
# Chrysler Imperial 14.7 8 230
# Ordinare per cilindri e poi consumo decrescente
mtcars %>%
select(mpg, cyl, hp) %>%
arrange(cyl, desc(mpg)) %>%
head(5)
# mpg cyl hp
# Toyota Corolla 33.9 4 65
# Fiat 128 32.4 4 66
# Honda Civic 30.4 4 52
# Lotus Europa 30.4 4 113
# Fiat X1-9 27.3 4 66
summarise() e group_by() - Riassumere i Dati
summarise() (o summarize()) riduce un dataframe a un riepilogo statistico. Combinato con group_by(), produce riepiloghi per ciascun gruppo.
# Riepilogo globale
mtcars %>%
summarise(
media_mpg = mean(mpg),
mediana_mpg = median(mpg),
sd_mpg = sd(mpg),
n_auto = n()
)
# media_mpg mediana_mpg sd_mpg n_auto
# 1 20.09062 19.2 6.026948 32
# Riepilogo per gruppi con group_by()
mtcars %>%
group_by(cyl) %>%
summarise(
media_mpg = mean(mpg),
media_hp = mean(hp),
n_auto = n()
)
# # A tibble: 3 x 4
# cyl media_mpg media_hp n_auto
# <dbl> <dbl> <dbl> <int>
# 1 4 26.7 82.6 11
# 2 6 19.7 122. 7
# 3 8 15.1 209. 14
# Raggruppamento per piu' variabili
mtcars %>%
group_by(cyl, am) %>%
summarise(
media_mpg = mean(mpg),
n = n(),
.groups = "drop"
)
La funzione n() conta il numero di osservazioni in ciascun gruppo. Il parametro .groups = "drop" rimuove il raggruppamento dopo il riepilogo.
count() - Contare le Osservazioni
count() e’ una scorciatoia per group_by() + summarise(n = n()).
# Contare auto per numero di cilindri
mtcars %>%
count(cyl)
# cyl n
# 1 4 11
# 2 6 7
# 3 8 14
# Contare con ordinamento
mtcars %>%
count(cyl, sort = TRUE)
# cyl n
# 1 8 14
# 2 4 11
# 3 6 7
# Contare per piu' variabili
mtcars %>%
count(cyl, am)
# cyl am n
# 1 4 0 3
# 2 4 1 8
# 3 6 0 4
# 4 6 1 3
# 5 8 0 12
# 6 8 1 2
rename() - Rinominare Colonne
rename() cambia il nome delle colonne con la sintassi nuovo_nome = vecchio_nome.
mtcars %>%
rename(
consumo = mpg,
cilindri = cyl,
cavalli = hp
) %>%
select(consumo, cilindri, cavalli) %>%
head(3)
# consumo cilindri cavalli
# Mazda RX4 21.0 6 110
# Mazda RX4 Wag 21.0 6 110
# Datsun 710 22.8 4 93
distinct() - Valori Unici
distinct() rimuove le righe duplicate.
# Valori unici di cilindri
mtcars %>%
distinct(cyl)
# cyl
# 1 6
# 2 4
# 3 8
# Combinazioni uniche di cilindri e cambio
mtcars %>%
distinct(cyl, am)
# cyl am
# 1 6 1
# 2 4 1
# 3 6 0
# 4 8 0
# 5 4 0
# 6 8 1
# Mantenere tutte le colonne con .keep_all
mtcars %>%
distinct(cyl, .keep_all = TRUE) %>%
select(mpg, cyl, hp)
slice() - Selezionare Righe per Posizione
slice() e le sue varianti selezionano righe specifiche in base alla posizione o a criteri numerici.
# Prime 5 righe
mtcars %>%
slice(1:5)
# Le 3 auto con consumo migliore
mtcars %>%
slice_max(mpg, n = 3)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# Le 3 auto con consumo peggiore
mtcars %>%
slice_min(mpg, n = 3)
# Campione casuale di 5 righe
mtcars %>%
slice_sample(n = 5)
Esempio Completo: Pipeline di Analisi
Ecco un esempio che combina diverse funzioni dplyr in una pipeline completa usando il dataset iris.
library(dplyr)
# Analisi completa del dataset iris
iris %>%
filter(Sepal.Length > 5.0) %>% # Solo fiori con sepalo > 5 cm
mutate(
Sepal.Ratio = Sepal.Length / Sepal.Width, # Rapporto dimensioni sepalo
Petal.Area = Petal.Length * Petal.Width # Area approssimata del petalo
) %>%
group_by(Species) %>% # Raggruppa per specie
summarise(
n_fiori = n(),
media_sepalo = round(mean(Sepal.Length), 2),
media_petalo_area = round(mean(Petal.Area), 2),
rapporto_medio = round(mean(Sepal.Ratio), 2),
.groups = "drop"
) %>%
arrange(desc(media_petalo_area)) # Ordina per area petalo
# # A tibble: 3 x 5
# Species n_fiori media_sepalo media_petalo_area rapporto_medio
# <fct> <int> <dbl> <dbl> <dbl>
# 1 virginica 49 6.69 12.15 2.07
# 2 versicolor 44 6.08 5.88 2.10
# 3 setosa 22 5.31 0.29 3.23
Conclusione
dplyr e’ il pacchetto fondamentale per la manipolazione dei dati in R. Le sue funzioni principali – select(), filter(), mutate(), arrange(), summarise() e group_by() – coprono la grande maggioranza delle operazioni necessarie nell’analisi dati quotidiana. L’operatore pipe %>% rende il codice leggibile e manutenibile, permettendo di costruire pipeline complesse passo dopo passo. Padroneggiare dplyr e’ il primo passo essenziale per lavorare efficacemente con i dati in R e nel tidyverse.