Il data.frame può essere considerato il tipo principale di struttura presente in R. Si tratta di una tabella in cui ogni colonna, contraddistinta da un nome, contiene valori di una specifica variabile. Tipicamente, nelle elaborazioni, un data.frame viene caricato dall'importazione di dati provenienti da una sorgente esterna. In questo caso, al fine di prendere confidenza con il concetto, ne creeremo uno noi, allineando vettori uno di fianco all'altro:
> persone <- data.frame(nomi=c("Franco", "Eugenio", "Andrea", "Marco", "Lorenzo", "Marco"),
+ cognomi=c("Rossi","Bianchi","Neri","Rossi","Gialli","Bianchi"),
+ eta=c(45,61,18,29,33,54),
+ citta=c("Roma","Milano","Napoli","Roma","Torino","Verona"))
> persone
nomi cognomi eta citta
1 Franco Rossi 45 Roma
2 Eugenio Bianchi 61 Milano
3 Andrea Neri 18 Napoli
4 Marco Rossi 29 Roma
5 Lorenzo Gialli 33 Torino
6 Marco Bianchi 54 Verona
Una volta in possesso di questi dati, possiamo iniziare a vedere come prelevarli:
- righe o singoli valori:
> persone[2,] # pensiamolo come un record di una classica tabella nomi cognomi eta citta 2 Eugenio Bianchi 61 Milano > persone[2,"eta"] # praticamente una cella della tabella [1] 61
Si noti che, nella prima ricerca, la virgola è necessaria per far ben intendere che vogliamo ottenere tutti i valori della riga. - colonne:
> persone["eta"] eta 1 45 2 61 3 18 4 29 5 33 6 54 > persone[3] eta 1 45 2 61 3 18 4 29 5 33 6 54 > persone$eta [1] 45 61 18 29 33 54 > persone[["eta"]] [1] 45 61 18 29 33 54
I primi due esempi di prelevamento del campoeta
restituiscono un data.frame, mentre il terzo e il quarto producono un vettore di interi.
Le doti di sintesi di R risultano più evidenti quando si applicano dei filtri ai dati. Selezioniamo, ad esempio, tutti i soggetti con più di 29 anni:
> persone[persone$eta>29,]
nomi cognomi eta citta
1 Franco Rossi 45 Roma
2 Eugenio Bianchi 61 Milano
5 Lorenzo Gialli 33 Torino
6 Marco Bianchi 54 Verona
È stato sufficiente imporre un vincolo tra le parentesi quadre. In alternativa, con una sintassi dall'aspetto più procedurale, si può ricorrere alla funzione subset
. La seguente espressione fornirà il medesimo risultato dell'istruzione precedente:
> subset(persone, eta>29)
Si può ricorrere a selezioni sempre più raffinate, come la seguente:
> subset(persone, eta>20 & cognomi=="Bianchi")
nomi cognomi eta citta
2 Eugenio Bianchi 61 Milano
6 Marco Bianchi 54 Verona
È stato chiamato in causa l'operatore & (AND logico) ma, in caso di necessità, si potrebbe utilizzare anche il simbolo |
per rappresentare l'OR.
Il data.frame da vicino
Il nostro data.frame non è molto esteso, ma solitamente la mole di dati che si vuole processare è piuttosto imponente. Per questo motivo, esiste una funzione denominata summary
che ha lo scopo di "riassumere" brevemente, in qualche modo, i dati:
> summary(persone)
nomi cognomi eta citta
Andrea :1 Bianchi:2 Min. :18.00 Milano:1
Eugenio:1 Gialli :1 1st Qu.:30.00 Napoli:1
Franco :1 Neri :1 Median :39.00 Roma :2
Lorenzo:1 Rossi :2 Mean :40.00 Torino:1
Marco :2 3rd Qu.:51.75 Verona:1
Max. :61.00
Come si vede, summary
esplora la tabella per colonne, offrendo un conteggio della distribuzione dei valori per città, nomi e cognomi mentre sull'età, trattandosi di numeri interi, ne approfitta per svolgere qualche operazione statistica tipo calcolo di media e mediana, massimo, minimo e quartili.
Altra funzione che ci permette di approfondire la nostra conoscenza del data.frame è str
, in grado di indagarne la struttura.
> str(persone)
'data.frame': 6 obs. of 4 variables:
$ nomi : Factor w/ 5 levels "Andrea","Eugenio",..: 3 2 1 5 4 5
$ cognomi: Factor w/ 4 levels "Bianchi","Gialli",..: 4 1 3 4 2 1
$ eta : num 45 61 18 29 33 54
$ citta : Factor w/ 5 levels "Milano","Napoli",..: 3 1 2 3 4 5
Il risultato in output propone una descrizione di ogni colonna: quella relativa al campo eta
non ci sorprende, riferendo di elementi numerici, ma nelle altre si nomina un elemento che non abbiamo ancora incontrato: il Factor.
Un Factor è la forma che assume in R ciò che in Statistica viene chiamata variabile categoriale, non frutto di misurazioni ma indicante spesso la qualità di qualcosa. I livelli (o Levels) che vengono nominati sono i valori che la variabile assume.
Applicazione di funzioni
Sebbene in questa sede non ci si voglia addentrare nei meandri delle Scienze Statistiche, ci sono funzioni che un informatico comunemente usa nell'ambito dei database, e per le quali esiste un corrispondente in R.
Ad esempio, se volessimo conoscere l'età media, massima o minima delle persone presenti nel data.frame, potremmo procedere come segue:
> mean(persone$eta)
[1] 40
> min(persone$eta)
[1] 18
> max(persone$eta)
[1] 61
> sum(persone$eta)
[1] 240
Anche se non ha molto senso calcolare la somma delle età dei soggetti presenti nella tabella, l'abbiamo fatto ugualmente nell'esempio al fine di menzionare l'utilizzo della funzione sum
.
Le funzioni aggregative possono risultare utili nella composizione di tabelle di contingenza che ricordano l'uso di funzioni di aggregazione in casi di raggrupamento dei dati. Uno dei modi per poter svolgere ciò in R consiste nell'impiego della funzione tapply
, tramite la quale potremo manovrare l'utilizzo delle funzioni appena citate. Seguono alcuni esempi.
Si può effettuare, ad esempio, il calcolo dell'età media per città:
> X<-tapply(persone$eta, persone$citta,max)
> X
Milano Napoli Roma Torino Verona
61 18 45 33 54
Il primo argomento dice su quale campo vogliamo applicare la funzione indicata al terzo parametro, mentre il secondo indica in base a quale colonna di valori effettueremo l'aggregazione. L'utilizzo della funzione class
ci permetterà di esplorare i tipi di dato dei risultati ottenuti:
> class(X)
[1] "array"
> d<-X["Milano"]
> class(d)
[1] "numeric"
Notiamo così che ogni elemento è stato reso come un array composto da valori numerici.
L'aggregazione può essere condotta anche sfrutttando più campi contemporaneamente:
> tapply(persone$eta, list(persone$citta,persone$nomi),mean)
Andrea Eugenio Franco Lorenzo Marco
Milano NA 61 NA NA NA
Napoli 18 NA NA NA NA
Roma NA NA 45 NA 29
Torino NA NA NA 33 NA
Verona NA NA NA NA 54
In pratica, ciò ci permetterebbe di calcolare l'età media delle persone con lo stesso nome, in una stessa città.
Script e librerie
Abbiamo visto una serie di utili strumenti di R, nonchè una dimostrazione della sinteticità dei suoi comandi. La console interattiva risulta utile per il suo utilizzo immediato, ma costringe spesso a ripetere le medesime operazioni (cosa, a volte, evitabile salvando l'area di lavoro al termine della sessione). Per ovviare a ciò, si possono utilizzare script costituiti da normali file di testo che potranno essere passati in lettura all'interprete. Inoltre, il progetto CRAN mette a disposizione molti package che possono essere integrati nel nostro ambiente di lavoro: ciò risulterà molto utile per lavori specifici.