00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.