Linguaggio R. le liste ed i data.frame

Cerca nel sito

Altri risultati..

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors


Indice

Le liste

Le “liste” vengono definite mediante l’istruzione:

nomelista<-list(label1=object1,label2=object2,…,labeln=objectn)


dove nomelista `e il nome della “lista” che si intende creare e gli argomenti di list sono oggetti elementari già esistenti a cui si attribuisce un’etichetta (label) che servirà successivamente a riconoscerli ed eventualmente estrarli ad uno ad uno. Ciò avviene semplicemente digitando il nome della lista seguito da quello dell’oggetto che si desidera estrarre, preceduto, questo dal prefisso $, ad esempio nomelista$label1.
I nomi che identificano gli elementi di una lista possono essere visualizzati in qualsiasi momento ricorrendo al comando names(nomelista).

Esempio:

Creazione, a partire degli oggetti x<-seq(1:10) e a<-letters[1:5], della lista mia.lista .
Posto di attribuire all’oggetto elementare x l’etichetta dati e all’oggetto a l’etichetta stringa, il problema viene risolto ricorrendo all’istruzione:

> mia.lista<- list(dati=x,stringa=a)

Linguaggio R. le liste

Dunque:

• Le liste, in R, sono oggetti che possono contenere altri oggetti
• In particolare, oggetti di tipo diverso (non sono omogenee) e non necessariamente contenenti lo stesso numero di elementi
• Segnatamente, possono contenere altre liste
• Le liste son ordinate, quindi l’ordine con cui gli oggetti vengono inseriti è conservato e può essere utilizzato come indice
• Le liste si creano con la funzione list(), passando come argomento gli oggetti da mettere nella lista. R consente di specificare i nomi di tali oggetti

Esempio:

lista <- list( a=c(1:5), b=c(“bianco”, “nero”), c=TRUE)
> lista
$a
[1] 1 2 3 4 5
$b
[1] “bianco” “nero”
$c
[1] TRUE

• Se assegniamo dei nomi, è molto facile accedere agli elementi della lista mediante il simbolo del dollaro $:
> lista$a
[1] 1 2 3 4 5
• Si può accedere anche con l’indice tra quadre. R ci ricorda il suo nome:
> lista[1]
$a
[1] 1 2 3 4 5
• Possiamo accedere direttamente all’elemento con le doppie quadre [[]]
> lista[[1]]
[1] 1 2 3 4 5
• Possiamo poi accedere agli elementi dell’oggetto con la solita sintassi a parentesi quadre:
> lista$b[2]
[1] “nero”

• Possiamo aggiungere elementi a una lista accedendo con un nome nuovo (mediante dollaro) o un indice nuovo
> lista$nuovocampo <- “prematura”
> lista
$a
[1] 1 2 3 4 5
$b
[1] “bianco” “nero”
$c
[1] TRUE
$nuovocampo
[1] “prematura”

• Possiamo rimuovere un elemento dalla lista assegnando il valore NULL
> lista$nuovocampo <- NULL

Funzioni:

• Vediamo alcune funzioni utili per le liste. Assumendo di avere la lista L
> L
$a
[1] “prova”
[[2]]
[1] TRUE
$c
[1] 1.2
[[4]]
[1] 3
length(L): restituisce la lunghezza della lista (i.e., length(L)=4)
mode(L[[i]]): restituisce il tipo dell’elemento i-esimo della lista (fate attenzione alle doppie quadre).

Per esempio,

mode(L[[2]]=logical)
names(lista): restituisce il nome degli elementi della lista. Nel nostro esempio,
names(L)=”a” “” “c” “”
• L’operatore %in% consente di verificare se un elemento è contenuto nella lista

Esempio:

Si immagini che l’oggetto ms.AB, con struttura di matrice, rappresenti la distribuzione congiunta dei caratteri colore degli occhi e colore dei capelli di 290 individui di sesso maschile:
> ms.AB<-array(c(32,38,10,3,11,50,10,30,10,25,7,3,15,7,8,31),dim=c(4,4))
> ms.AB
[,1] [,2] [,3] [,4]
[1,] 32 11 10 15
[2,] 38 50 25 7
[3,] 10 10 7 8
[4,] 3 30 3 31
Desiderando attribuire alle modalità di ciascuna mutabile statistica (m.s.) le appropriate etichette, possiamo ricorrere ai comandi dimnames() e list() nel modo seguente:

Ti potrebbe interessare anche:  Python: Guida alle espressioni regolari: le funzioni re.search, re.findall e re.finditer

dimnames(ms.AB)<-list(Capelli=c(“Neri”,”Castani”,”Rossi”,”Biondi”),
Occhi = c(“Neri”,”Castani”,”Verdi”,”Azzurri”))
ottenendo, coerentemente:

I Data frame

Analogamente alle liste, i “data frame” vengono definiti mediante l’istruzione:

nomedf<-data.frame(label1=object1,label2=object2,…,labeln=objectn)

dove manifestamente nomedf è il nome del data frame che si intende creare mentre gli argomenti di data.frame sono oggetti elementari già esistenti e di egual cardinalità a cui è possibile attribuire un’etichetta (label) che consente di riconoscerli in modo più spedito. Benchè i data frame così creati abbiano struttura list, si differenziano dalle “liste” per come vengono estratti e gestiti i singoli componenti.
Definito un data frame, affinchè i suoi elementi siano disponibili, occorre impartire il comando attach(nomedf), in seguito al quale i singoli componenti si comportano quali comuni variabili. Il comando detach(nomedf) scarica il data frame dall’area di lavoro.
Ricordiamo, infine, che i nomi che identificano gli elementi di una data frame possono essere visualizzati in qualsiasi istante ricorrendo al comando names(nomedf).
Esempio

Creazione del data frame mydata contenente, in forma compatta, due variabili di interesse per successive elaborazioni:

dataframe: un esempio

Si noti che l’area di lavoro contiene il solo oggetto mydata, i cui componenti, peraltro, non sono ancora disponibili, infatti:

sesso
Error: Object “sesso” not found
> eta
Error: Object “eta” not found

Desiderando effettuare alcune elaborazioni sui dati contenuti negli oggetti del data frame, è necessario ricorrere al comando attach(mydata); nel caso proposto, ad esempio:

attach(mydata)
> cat(“L’eta’ media e’:”,round(sum(eta)/length(eta),2),”\n”)
L’eta’ media e’: 23.36
> detach(mydata)

Dunque:

• I data frame sono usati da R per immagazzinare tabelle di dati
• Sono collezioni di oggetti, semplici o complessi, anche di tipi diversi (inclusi altri data frame). Le colonne del data frame rappresentano variabili i cui modi ed attributi possono essere differenti (le matrici e gli array sono invece costituiti da elementi omogenei per modo ed attributo):

 

• Un data frame può essere considerato come una matrice le cui colonne rappresentano dati eterogenei:

un dataframe può contenere informazioni di natura eterogenea

• Formalmente i data frame sono liste di classe data.frame
• I componenti (colonne) del data frame possono essere costituiti da:
– Vettori (numerici, a caratteri, logici)
– Fattori
– Matrici numeriche
– Liste
– Altri data frame

• I vettori numerici, logici ed i fattori sono inclusi direttamente come variabili (colonne) del data frame, mentre i vettori a caratteri sono forzati a fattori.
• Le matrici forniscono tante variabili al data frame quante sono le rispettive colonne
• Le liste forniscono tante variabili quanti sono i suoi componenti
• I data frame quanti sono i componenti
Restrizioni sulle componenti del data frame:
• I vettori componenti devono avere tutti la stessa lunghezza, mentre le matrici devono avere tutte lo stesso numero di righe
• I componenti delle liste incluse nel data frame devono rispettare le restrizioni di cui al punto precedente
• Le componenti del data frame A incluso nel data frame B devono essere conformi alle componenti del data frame B.

Ti potrebbe interessare anche:  Python: alcune funzioni pronte all'uso per Statistica descrittiva

• Possono essere visti come spreadsheets di excel
• Per creare un nuovo data frame basta usare la funzione data.frame(), passandogli come argomenti i vettori delle colonne.

 > A <- c(1,10,100,1000)
> B <- c(“qui”, “quo”, “qua”, “paperina”)
> C <- c(TRUE, TRUE, TRUE, FALSE)
> nd <- data.frame(A,B,C,row.names=c(“r1”, “r2”, “r3”, “r4”))
> nd

     A  B C
r1 1 qui TRUE
r2 10 quo TRUE
r3 100 qua TRUE
r4 1000 paperina FALSE

I data frame possono essere costruiti con matrici.

Le matrici componenti il data frame devono avere lo stesso numero di righe:

> m1 <­matrix(1:12,nrow=2)

m2 <­matrix(13:18,nrow=2)
> daf<­data.frame(m1,m2)
> daf
X1 X2 X3 X4 X5 X6 X1 X2 X3
1 1 3 5 7 9 11 13 15 17
2 2 4 6 8 10 12 14 16 18
> m3 <­matrix(1:12,nrow=4)
> daf2<­data.frame(m1,m3)
Error in data.frame(m1, m3):
arguments imply differing number of rows: 2, 4

Si possono utilizzare insieme matrici e vettori, purchè il numero delle righe delle matrici sia uguale alla lunghezza dei vettori:

m1 <­matrix(1:12,nrow=2)
> v <­ c(“A”,”C”)
> daf3<­data.frame(m1,v)
> daf3
X1 X2 X3 X4 X5 X6 v
1 1 3 5 7 9 11 A
2 2 4 6 8 10 12 C
> v1<­ c(“A”,”C”,”G”)
> daf4<­data.frame(m1,v1)
Error in data.frame(m1, v1) :
arguments imply differing number of rows: 2, 3

Si possono utilizzare come componenti liste e data frame (ed anche matrici vettori e fattori), purchè compatibili:

li <-­ list(a=matrix(1:12,nrow=3), v=c(“G”,”G”,”C”))
>daf.comp<­data.frame(v1= c(“A”,”B”,”C”),v2=c(“D”,”E”,”F”))
> daf2<­data.frame(li,daf.comp)
> daf2
a.1 a.2 a.3 a.4 v v1 v2
1 1 4 7 10 G A D
2 2 5 8 11 G B E
3 3 6 9 12 C C F

Accesso alle componenti ed agli elementi dei data frame

Esistono due modalità generali di accesso alle componenti ed agli elementi dei data frame:
• I data frame sono liste, e quindi è possibile accedere ad essi secondo le modalità di accesso tipiche delle liste stesse.
• Come classe data frame, sono definiti operatori di accesso tramite vettori di indici, simili a quelli utilizzati per le matrici e gli array.

Essendo liste, è possibile accedere alle componenti dei data frame secondo le modalità tipiche delle liste:
2. Accesso tramite indice numerico
3. Accesso tramite il nome delle componenti
4. Accesso tramite indice “a caratteri”

Accesso alle componenti tramite vettori di indici

Sono definiti operatori di accesso specifici per la classe data.frame: si tratta di vettori di indici con una semantica simile a quella delle matrici ordinarie:

Estrazione “logica” di osservazioni da data frame

Sia:

Allora:

Lettura di data frame da un file

Esistono cinque diversi comandi per leggere dei data frame da un file F:

read.table(file=F): è il metodo principale, da cui derivano tutti gli altri. Mediante gli argomenti opzionali è possibile specificare il tipo di separatore dei dati (sep=””), il separatore dei decimali (dec=””), se usare la prima riga come header della tabella (header=T), e così via. Per ulteriori informazioni usate help(read.table).
•  read.csv(): identico a read.table, ma pensato per leggere files “comma-separated”, cioè, nei quali i dati sono separati da virgole
read.csv2(): identico a read.csv, ma pensato per leggere files “comma-separated” in cui i decimali sono separati da virgole anziché punti

Ti potrebbe interessare anche:  Le origini del calcolo meccanico

read.delim(): identico a read.table, ma pensato per leggere files “tab-separated”, cioè, nei quali i dati sono separati da tablature (o altri caratteri di delimitazione)
read.delim2(): identico a read.delim, ma pensato per leggere files “tab-separated” in cui i decimali sono separati da virgole anziché punti
Tutti questi metodi restituiscono una variabile di tipo data frame.

Scrivere su file

Simmetricamente alla read.table(), possiamo usare la funzione write.table() per scrivere un data frame su un file
• Il comando write.table(DF, file=”nome_del_file”) scrive il data frame  DF nel file nome_del_file
• Esistono argomenti aggiuntivi per dire a R come organizzare il file, quali separatori utilizzare, se “appendere” o sovrascrivere un file precedente, e così via.
• Esistono anche le funzioni write.csv() e write.csv2() con una semantica uguale a quella vista per la famiglia di funzioni read.csv() e read.csv2()
• Consultate help(write.table) per ulteriori informazioni

Esempio:

Lettura di dati su file esterno in formato ASCII

 cicale=read.table(“cicala.txt”,header =TRUE,nrows=104,row.names=1)

– la prima riga contiene il nome delle variabili (`e il default, si pu`o omettere)
– vanno lette 104 righe
– la prima colonna contiene il nome delle unit`a sperimentali
– i dati sono separati da spazi bianchi (default)

istruz1991= read.table(“regioni_istr_1991.txt”, sep=”\t”, na.strings=”*”,row.names=1)

– i dati sono separati da spazi tabulatore
– i dati mancanti sono indicati con *
– la prima colonna contiene il nome delle unit`a sperimentali
– la prima riga contiene il nome delle variabili (default)

dati = read.table(“dati.txt”, sep=”,”)

– i dati sono separati da virgola
– non ci sono colonne contenenti il nome delle unità sperimentali

istruzione read.fwf per dati scritti in specifiche colonne

cars= read.fwf(“cars2.txt”, width = c(9, 27, 6, 7, 6, 5 ,5,1,6),header =F, col.names = c(“nazione”, “tipo”,”percorrenza”, “peso”, “rapporto”,”potenza”, “cilindrata”, “num_cil”,”ripresa”))

– i dati sono scritti in specifiche colonne di cui viene fornita l’ampiezza dei campi (ad esempio la prima variabile è scritta in 9 colonne, la seconda nelle successive 16, e così via)
– la prima riga non contiene i nomi delle variabili header=FALSE
– viene assegnato il nome alle colonne.

 

 

Le funzioni attach e detach

La notazione oggetto$componente utilizzata per liste e data frame in alcuni contesti può essere eccessivamente verbosa e poco conveniente.
La funzione attach “rende disponibili” nel cammino di ricerca corrente i nomi delle componenti come se fossero variabili “stand alone”:

Assegnamenti o modifiche sulle variabili “estratte” dal data frame con attach non hanno effetto sul data
frame stesso. Per modificare le componenti è necessario utilizzare la notazione oggetto$componente

 

 

 

 

 

(918)