Manipolazione dati con R base e dplyr

Home/R/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.

[code] # 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)[/code]

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:

[code] # 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)[/code]

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

[code] select(iris, -Species)[/code]

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

[code] select(iris, -(Petal.Length:Sepal.Length))[/code]

– 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.

[code] # 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)[/code]

– 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:

[code] filter(iris, Species== "setosa")[/code]

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”

[code] # 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[/code]

– arrange()

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

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

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

[code] arrange(iris, desc(Sepal.Length))[/code]

– summarise()

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

[code] summarise(iris, mean(Sepal.Length), median((Sepal.Length)))[/code]

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!

About the Author:

Leave A Comment