Analisi dei Dati ed Estrazione della Conoscenza

Il sistema R: matrici, array, liste e dataframe

Matrici ed Array

Le matrici sono collezioni di dati dello stesso tipo, individuate da due indici di riga e colonna. Gli array sono estensioni del concetto di matrice a più di due dimensioni.

Riassumiamo le funzioni disponibili per il trattamento di matrici. Si rimanda alla dispansa di Muggeo e Ferrara per le spiegazioni:

Per quanto riguarda gli array, si usano esattamente le stesse operazioni previste per le matrici (quando applicabili). In più abbiamo la funzione array per la creazione di un nuovo array.

La funzione apply

Quando si possiede una struttura dati complessa, è spesso necessario eseguire una determinata operazione per ognuno dei suoi elementi. Nei linguaggi di programmazione standard questo si fa tipicamente con dei cicli for, ma nei linguaggi funzionali, come R, si sfruttano le capacità di ordine superiore del linguaggio.

Esercizio

Scrivere una espressione che calcoli la tabella pitagorica di lato 12, ovvero una matrice 12x12 nella quale, nella posizione (i,j), via sia il prodotto i * j. Utilizzare la funzione apply (esistono altri metodi più furbi basati sul calcolo matriciale).

Esercizio

Scrivere una funzione tavolapitagorica che prende in input un interno n e restituisce la tavola pitagorica di dimensione n * n.

Soluzione

Liste

Un ulteriore tipo di dato supportato da R è il tipo lista. La lista è una sequenza di elementi che, a differenza di vettori, matrici ed array, possono avere tutti tipo diverso.

Data Frame

L'ultima struttura dati che vediamo è il data frame. Questo è un tipo particolare di lista che viene utilizzata per rappresentare degli insiemi di dati. Gli elementi di un data-frame sono vettori (numerici o stringhe) tutti della stessa lunghezza: ogni vettore rappresenta un attributo dell'insieme di dati. Il data frame ha anche varie caratteristiche in comune con le matrici.

Le funzioni apply per liste e dataframe

La funzione apply ha degli analoghi che si applicano alle liste (e quindi ai data frame) invece che agli array.

La funzione fun che si passa ad apply (e simili) può essere una funzione predefinita, ma non necessariamente. Ad esempio, nell'esempio che segue definiamo una nuova operazione meansd che, dato un vettore, restituisce una nuovo vettore con la media e lo scarto quadratico medio dell'input. Utilizziamo poi questa nuova funzione con apply.

> l <- data.frame(a=c(1,1,2), b=c(10,20,30))
> myfun <- function (v) c(mean(v),sd(v))
> myfun(l$a)
[1] 20 10
> sapply(l,myfun)
             a  b
[1,] 1.3333333 20
[2,] 0.5773503 10

Al solito, non è necessario definire una nuova funzione esplicitamente, come è stato fatto sopra. Invece di passare a sapply la funzione myfun, potevamo passare direttamente il codice R che definisce tale funzione. Ad esempio

> l <- data.frame(a=c(1,1,2), b=c(10,20,30))
> sapply(l,function (v) c(mean(v),sd(v)))
> sapply(l,myfun)
             a  b
[1,] 1.3333333 20
[2,] 0.5773503 10

Esercizio

A partire dal set di dati sull'iris, calcolare una matrice che ha tante colonne quante sono le variabili del data frame e due sole righe. Ogni colonna contiene media e scarto quadratico medio della variabile corrispondente (se la variabile è numerica), o i valori di entropia assoluta e relativa se la variabile è categoriale.

In pratica, il risultato deve essere la seguente matrice:

     sepallength sepalwidth petallength petalwidth    class
[1,]   5.8433333  3.0540000    3.758667  1.1986667 1.584963
[2,]   0.8280661  0.4335943    1.764420  0.7631607 1.000000

Soluzione

Lettura da file esterni

È possibile leggere dei dati provenienti da file esterni e salvare i risultati delle elaborazioni. I comandi più utili a tale scopo sono read.table e write.table.

Un caso particolare di file di testo contenente dati in formato tabellare è un file in formato CSV (Comma Separated Values). In un file CSV la prima riga contiene i nomi dei campi, e i campi sono separati da virgole. Per leggere e scrivere file CSV è possibile usare read.table/write.table con i parametri opportuni, oppure usare le funzioni specifiche read.csv e write.csv.

Esercizio

Importare in R i set di dati weather.csv e weather.nomincal.csv.

Valid XHTML 1.1 Valid CSS!