Manipolazione dati con R base e dplyr

In questo post parliamo della manipolazione dati con R, ossia della gestione e trasformazione dei dataframe in modo che si rendano adatti a certi tipi di analisi: possiamo ad esempio creare delle nuove variabili addizionando due variabili del dataset originale, oppure organizzare fisicamente i dati in maniera diversa.

Esistono molti pacchetti e funzioni che permettono di gestire e manipolare dei dataframe tramite R. Sebbene sia possibile effettuare queste operazioni con il pacchetto base, spesso l’utilizzo di altri pacchetti, come ad esempio dplyr o tidyr, rende il lavoro più semplice e veloce.

Vediamo cosa succede se analizziamo uno dei dataset precaricato in R, iris. Questo dataset contiene dati su tre tipi di fiori, iris virginica, iris setosa e iris versicolor. Se volessimo mettere a confronto i tre tipi di fiori contenuti nel database con le funzioni base di R, dovremmo procedere nel modo che segue.

# per prima cosa dividiamo il dataset in 3 sottoinsiemi comprendenti i tre tipi di fiori, uno per virginica, uno per setosa e uno per versicolor
setosa <- subset(iris, Species == “setosa")
versicolor <- subset(iris, Species == "versicolor")
virginica <- subset(iris, Species == “virginica")

# adesso visualizziamo un paio di osservazioni da uno dei sottogruppi
head(setosa, 2)

# dobbiamo rimuovere la quinta colonna, “Species”
iris.setosa <- setosa[-5]
head(iris.setosa)

# eliminiamo la quinta colonna anche per gli altri due sottogruppi
iris.versicolor <- versicolor[-5]
iris.virginica <- virginica[-5]

# abbiamo creato tre nuove variabili che contengono i sottogruppi ma senza l’ultima colonna
iris.setosa2 <- colMeans(iris.setosa)
iris.virginica2 <- colMeans(iris.virginica)
iris.versicolor2 <- colMeans(iris.versicolor)

# sto creando ogni volta tre variabili diverse per non confondere i vari passaggi, anche se potrei semplicemente sovrascrivere i vari oggetti

# adesso troviamo la media delle larghezza e della lunghezza dei petali e dei sepali
rbind(iris.setosa2, iris.versicolor2, iris.virginica2)

La manipolazione dati con R è molto più semplice e veloce se utilizziamo dei pacchetti. dplyr, ad esempio, permette di selezionare più facilmente casi e variabili. dplyr si fonda su cinque funzioni base: select, mutate, filter, arrange e summarize. In particolare, considerando una matrice casi per variabili, select e mutate si occupano di organizzare le variabili, filter e arrange i casi, e summarize i gruppi.

– select()

Per prima cosa vediamo la funzione select() di dplyr. La funzione select() consente di richiamare le variabili semplicemente con il loro nome e utilizzando la virgola come separatore, con questa struttura:

select(nome.dataframe, variabile1, variabile2, variabile3, variabile4)

Possiamo anche selezionare più variabili contigue con i due punti:

select(nome.dataframe, variabile1:variabile4)

Vediamo qualche esempio:

# selezioniamo tutte le variabili mettendo il nome di ognuna
select(iris, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species)

# selezioniamo le stesse variabili con il simbolo “:”
select(iris, Sepal.Length:Species)

Se vogliamo importare tutte le variabili tranne una, facciamo in questo modo:

select(iris, -Species)

Per eliminare più di una variabile, invece, facciamo così:

select(iris, -(Petal.Length:Sepal.Length))

– mutate()

Anche la funzione mutate() si occupa di filtrare le variabili, in particolare permette di creare nuove variabili in uno stesso dataset ad esempio sommando, o dividendo, due variabili, oppure calcolandone la media.

# creiamo un dataset che presenta il totale passeggeri di una compagnia aerea negli ultimi 6 anni
anno <- c(2010, 2011, 2012, 2013, 2014, 2015)
primo.trim <- c(3400, 2900, 3000, 3500, 2800, 3000)
secondo.trim <- c(4500, 4700, 4400, 5000, 5600, 5700)
terzo.trim <- c(7100, 7800, 6500, 6000, 6400, 7000)
quarto.trim <- c(3700, 4000, 4500, 2900, 3000, 2500)

# creiamo un dataframe con i vettori creati e cbind()
passeggeri <- as.data.frame(cbind(anno, primo.trim, secondo.trim, terzo.trim, quarto.trim))

# sommiamo il totale passeggeri e creiamo con mutate una nuova variabile che contenga tutti i passeggeri per ogni anno
mutate(passeggeri, totale.passeggeri = primo.trim+secondo.trim+terzo.trim+quarto.trim)

# se vogliamo includere la nuova variabile totale.passeggeri, ricordiamo sempre che dobbiamo sovrascrivere il vecchio dataset o crearne uno nuovo. In questo caso, per non confonderci nei passaggi, creiamone uno nuovo:
passeggeri2 <- mutate(passeggeri, totale.passeggeri = primo.trim+secondo.trim+terzo.trim+quarto.trim)

– filter()

Come abbiamo detto, la funzione filter() di dplyr serve fondamentalmente a selezionare velocemente un gruppo di casi in un dataset. Ad esempio, nel nostro classico dataset iris, possiamo selezionare tutti i casi nella variabile “Species” contrassegnati come “setosa” in questo modo:

filter(iris, Species== "setosa")

Per filtrare dei casi a partire da un dataset possiamo usare non solo il vettore uguale, ma anche gli altri operatori binari che abbiamo visto in precedenza. Ricordiamoli brevemente:

< minore > maggiore
== uguale
<= minore o uguale >= maggiore o uguale
!= diverso
& “e”
| “o”
! “non”

# ad esempio, estraiamo tutti i casi dal dataset iris che non sono etichettati come “setosa”
senza.setosa <- filter(iris, Species!=“setosa")
senza.setosa

# in questo caso abbiamo usato l’operatore !=

# potremo anche restringere ad altri sottogruppi, ad esempio estraendo da una variabile solo i casi maggiori di o minori di un valore
virginica <- filter(iris, Species=="virginica", Petal.Length <= 5)
virginica
  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          4.9         2.5          4.5         1.7 virginica
2          5.7         2.5          5.0         2.0 virginica
3          6.0         2.2          5.0         1.5 virginica
4          5.6         2.8          4.9         2.0 virginica
5          6.3         2.7          4.9         1.8 virginica
6          6.2         2.8          4.8         1.8 virginica
7          6.1         3.0          4.9         1.8 virginica
8          6.0         3.0          4.8         1.8 virginica
9          6.3         2.5          5.0         1.9 virginica

– arrange()

La funzione di dplyr arrange(), serve invece a ordinare i nostri dati in base ai valori di una o più variabili.

# ad esempio, organizziamo il dataset iris in base alla variabile Sepal.Length
arrange(iris, Sepal.Length)

Possiamo anche ordinare una variabile dal valore più alto al più basso, in questo modo:

arrange(iris, desc(Sepal.Length))

– summarise()

Infine, la funzione summarize() viene utilizzata per creare una serie di prime analisi sui nostri dati.

summarise(iris, mean(Sepal.Length), median((Sepal.Length)))

Spero che adesso ti sia più chiaro come effettuare una manipolazione dati con R. Questo post fa parte di una serie di articoli rivolta a chi comincia a programmare con R. Qui puoi trovare alcune nozioni introduttive sulle strutture, sugli errori più comuni e importazione dati. Se ti interessa qualche argomento particolare, scrivilo pure nei commenti!

By | 2017-02-21T09:48:42+00:00 gennaio 19th, 2017|R|0 Comments

Leave A Comment