Modulo III - Introduzione ad R Elisabetta Ronchieri Università di Ferrara Dipartimento di Economia e Management e-mail: [email protected] 7 Novembre 2016 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 1 / 55 Contenuti 1 Vettori 2 Array e Matrici Matrici Array 3 Fattori 4 Lista 5 Data Frame Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 2 / 55 Strutture dati Nei linguaggi di programmazione ad alto livello non si ha accesso diretto alla memoria fisica, ma ad una sua astrazione tramite una struttura dati. R fornisce le seguenti strutture dati: Vettori Array e matrici Fattori Liste Data frame Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 3 / 55 Vettori I vettori rappresentano sequenze ordinate di elementi omogenei. Un vettore v è rappresentabile tramite una struttura unidimensionale. v 4 5 1 3 6 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 4 / 55 Creazione di vettori La funzione c() permette di concatenare gli elementi di un vettore. Vettore di interi > c (1 ,2 ,3) [1] 1 2 3 Vettore di caratteri > c ( ”A” , ”B” , ”C” ) [ 1 ] ”A” ”B” ”C” Vettore di stringhe > c (” euro ” , ” d o l l a b o r ” , ” franco s v i z z e r o ” ) [ 1 ] ” euro ” ” dollabor ” ” franco svizzero ” Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 5 / 55 Variabili ed assegnamenti Un vettore può essere assegnato ad una variabile. Assegnare un vettore alla variabile v1 > v1<−c ( 1 , 2 , 3 ) > v1 [1] 1 2 3 Assegnare un nuovo valore alla variabile v1, cancellando il contenuto precedente > v1<−c ( 4 , 5 ) > v1 [1] 4 5 Assegnare un vettore di un elemento ad una variabile v2 > v2<−1 > v2 [1] 1 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 6 / 55 Tipi elementari di vettori I vettori sono sequenze ordinate i cui elementi possono essere di 3 tipi base: 1 Numerici: numeri interi o con la virgola (codificata con il .); 2 Caratteri: singoli caratteri o stringhe (sequenze) di caratteri; 3 Logici: TRUE (T) o FALSE (F) Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 7 / 55 Operazioni aritmetiche tra vettori Le operazioni aritmetiche vengono eseguite sui vettori elemento per elemento. Addizione e sottrazione. > v1 <− > v2 <− > v3 <− > v3 [1] 5 7 > v4 <− > v4 [1] 3 3 c (1 , 2 , 3) c (4 , 5 , 6) v1 + v2 9 v2 − v1 Moltiplicazione e divisione. > v1 <− c ( 1 , 2 , 3 ) > v2 <− c ( 4 , 5 , 6 ) > v3 <− v1 ∗ v2 > v3 [ 1 ] 4 10 18 > v4 <− v2 / v1 > v4 [ 1 ] 4.0 2.5 2.5 3 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 8 / 55 Regola del riciclo Se si sommano due vettori di diversa lunghezza in R, il vettore più corto viene ripetuto tante volte fino a raggiungere la lunghezza del vettore di maggior lunghezza. La regola vale anche per altre strutture dati e per altre operazioni. > v1 <− c ( 1 , 2 ) > v1 [1] 1 2 > v2 <− c ( v1 , v1 ) > v2 [1] 1 2 1 2 > v3 <− c ( 3 , 4 , 5 , 6 ) > v2 ∗ v3 [1] 3 8 5 12 > # i l v e t t o r e v1 v i e n e r i p e t u t o due > # volte ( regola del r i c i c l o ) > v1 ∗ v2 [1] 1 4 1 4 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 9 / 55 Funzioni applicate a vettori numerici Di seguito alcune funzioni applicate ai vettori. > v1 <− c ( 1 , 2 , 3 ) > mean ( v1 ) [1] 2 > max ( v1 ) [1] 3 > min ( v1 ) [1] 1 > r a n g e ( v1 ) [1] 1 3 > sum ( v1 ) [1] 6 > p r o d ( v1 ) [1] 6 Elisabetta Ronchieri > v2<−c ( 1 , 2 , 2 , 4 , 5 ) > u n i q u e ( v2 ) [1] 1 2 4 5 > # p o s i z o i n e d i 2 i n v2 > which ( v2==2) [1] 2 3 > u n i o n ( v1 , v2 ) [1] 1 2 3 4 5 > i n t e r s e c t ( v1 , v2 ) [1] 1 2 > s e t d i f f ( v1 , v2 ) [1] 3 > i s . e l e m e n t ( 7 , v2 ) [ 1 ] FALSE > v3<−c ( 2 , 1 , 4 , 3 ) > v4<−s o r t ( v3 ) > # ordinamento c r e s c e n t e > s o r t ( v3 ) [1] 1 2 3 4 > # posizione degli i n d i c i del vettore > # o r d i n a t o i n modo c r e s c e n t e > o r d e r ( v3 ) [1] 2 1 4 3 Modulo III.1 - Strutture Dati 7 Novembre 2016 10 / 55 Generazioni di sequenze di numeri Di seguito alcune funzioni che permettono di generare sequenze di numeri. Funzione c() > c (1:10) [1] 1 2 3 > c (5:1) [1] 5 4 3 2 1 4 5 6 7 8 9 10 Funzione seq() che può avere 5 argomenti > seq ( 1 , 1 0 ) [1] 1 2 3 4 5 6 7 8 9 10 > s e q ( from =1 , t o =4 , by =0.5) [ 1 ] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Funzione rep() > r e p ( c ( 1 , 2 ) , t i m e s =4) [1] 1 2 1 2 1 2 1 2 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 11 / 55 Operazioni logiche su vettori I vettori possono assumere valori logici. Gli opeatori logici: <, <=, <, >, ==, ! = > v <− 3 : 8 > v > 5 [ 1 ] FALSE FALSE FALSE TRUE TRUE TRUE > v <= 5 [ 1 ] TRUE TRUE TRUE FALSE FALSE FALSE > # o p e r a t o r e u g u a g l i a n z a == > v == 5 [ 1 ] FALSE FALSE TRUE FALSE FALSE FALSE > # o p e r a t o r e d i s e g u a g l i a n z a != > v != 5 [ 1 ] TRUE TRUE FALSE TRUE TRUE TRUE Elisabetta Ronchieri > > v [ v >5] [1] 6 7 8 > v [ v<=5] [1] 3 4 5 > > v [ v==5] [1] 5 > > v [ v !=5 ] [1] 3 4 6 7 8 Modulo III.1 - Strutture Dati 7 Novembre 2016 12 / 55 Dati mancanti Alcuni elementi di un vettore possono essere non noti o disponibili. NA o Not Available è il valore speciale che viene attribuito a tale elemento da R. Qualunque operazione che coinvolga valori NA ha come risultato NA. > v<−c ( 1 : 4 , NA) > v [ 1 ] 1 2 3 4 NA > v + 2 [ 1 ] 3 4 5 6 NA NA non è un valore ma un marcatore di una quantità non disponibile. Per individuare quali elementi siano effettivamente NA in un vettore si deve usare la funzione is.na(): > i s . na ( v ) [ 1 ] FALSE FALSE FALSE FALSE Elisabetta Ronchieri TRUE Modulo III.1 - Strutture Dati 7 Novembre 2016 13 / 55 Selezione e accesso a sottoinsiemi di elementi di un vettore Esistono diverse modalità di accesso a singoli elementi o a sottoinsiemi di elementi di un vettore. La selezione e l’accesso avviene tramite l’ operatore [] (parentesi quadre). Sottoinsiemi di elementi di un vettore sono selezionati collegando al nome del vettore un vettore di indici in parentesi quadre. Esistono 4 diverse modalità di selezione/accesso: vettori di indici interi positivi vettore di indici interi negativi vettore di indici logici vettori di indici a caratteri Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 14 / 55 Selezione e accesso a sottoinsiemi di elementi di un vettore Gli elementi di un vettore v1 sono selezionati tramite un vettore v2 di indici positivi racchiuso fra parentesi quadre: v1[v2]. > v1 <− 1 : 5 > v1 [ 1 ] # s e l e z i o n e d i un s i n g o l o e l e m e n t o [1] 1 > v1 [ 5 ] [1] 5 > l e n g t h ( v1 ) # l u n g h e z z a d e l v e t t o r e [1] 5 > v1 [ 7 ] # a c c e s s o ad un e l e m e n t o f u o r i r a n g e [ 1 ] NA > v1 [ 2 : 4 ] [1] 2 3 4 > v1 [ c ( 1 , 3 , 5 ) ] [1] 1 2 5 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 15 / 55 Selezione e accesso a sottoinsiemi di elementi di un vettore Gli elementi di un vettore v1 che devono essere esclusi sono selezionati tramite un vettore v2 di indici negativi racchiuso fra parentesi quadre: v1[v2]. > v1 <− r e p ( c ( ”A” , ”B” , ”C” ) , t i m e s =3) > v1 [ 1 ] ”A” ”B” ”C” ”A” ”B” ”C” ”A” ”B” ”C” > v2 <− v1 [ − ( 1 : 5 ) ] # s e l e z i o n a t i t u t t i g l i e l e m e n t i d i v1 e c c e t t o i p r i m i 5 > v2 [ 1 ] ”C” ”A” ”B” ”C” > v2 <− v2[− l e n g t h ( v2 ) ] # c a n c e l l a z i o n e d e l l ’ u l t i m o e l e m e n t o d i v2 > v2 [ 1 ] ”C” ”A” ”B” Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 16 / 55 Selezione e accesso a sottoinsiemi di elementi di un vettore Gli elementi di un vettore v1 sono selezionati tramite un vettore v2 di indici logici. Il vettore indice deve essere della stessa lunghezza del vettore i cui elementi devono essere selezionati. Sono selezionati gli elementi corrispondenti a TRUE nel vettore degli indici ed omessi quelli corrispondenti a FALSE. > v1 <− c ( 1 : 5 , NA, NA) > v1 [1] 1 2 3 4 5 NA NA > v2 <− c ( r e p (TRUE, t i m e s =3) , r e p ( FALSE , t i m e s =4)) > v2 # v2 i l vettore indice logico [ 1 ] TRUE TRUE TRUE FALSE FALSE FALSE FALSE > v1 [ v2 ] # s e l e z . elementi tramite vett . indice logico [1] 1 2 3 > v1 [ ! i s . na ( v1 ) ] # s e l e z i o n e e l e m e n t i c h e non s o n o NA [1] 1 2 3 4 5 > v1 [ ! i s . na ( v1 ) & v1 > 2 ] [1] 3 4 5 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 17 / 55 Selezione e accesso a sottoinsiemi di elementi di un vettore Gli elementi di un vettore v1 sono selezionati tramite un vettore v2 di indici a caratteri. È applicabile quando un vettore possiede un attributo names per identificare le sue componenti. > c a m p i o n e <− c ( 4 5 , 2 0 0 0 , 5 0 0 ) > names ( c a m p i o n e ) <− c ( ” Eta ” , ” S t i p e n d i o ” , ” T a s s e ” ) > campione Eta S t i p e n d i o T a s s e 45.00 2000 500 > Eta . S t i p e n d i o <− c a m p i o n e [ c ( ” Eta ” , ” S t i p e n d i o ” ) ] > Eta . S t i p e n d i o Eta S t i p e n d i o 45 2000 > Eta . T a s s e <− c a m p i o n e [ c ( ” Eta ” , ” T a s s e ” ) ] > Eta . T a s s e Eta T a s s e 45 500 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 18 / 55 Esercizi 1 2 Generare un vettore v contenente i primi 10 interi positivi. Costruire una sequenza s costituita da 3 ripetizioni in sequenza dei caratteri ”A”, ”B” e ”C”. Estrarre dalla sequenza ottenuta una sotto sequenza ss in cui compaiano tutti gli elementi di s eccetto il carattere C; Aggiungere in coda alla sequenza ottenuta 3 valori NA; Riottenere la sequenza ss tramite la funzione is.na(). 3 Cosa accade se si prova a costruire un vettore eterogeneo di numeri e caratteri ? 4 Cosa accade se si prova a costruire un vettore eterogeneo di numeri e di valori logici ? 5 Generare un vettore v di 10 numeri che vanno da -2 a 7 e selezionare solo quelli positivi. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 19 / 55 Array e Matrici Le matrici sono estensioni bidimensionali di vettori. 1 4 7 2 5 8 3 6 9 Per accedere o modificare un elemento della matrice è necessaria una coppia di indici. Detta m la matrice di sopra, per selezionare l’elemento nella riga 1 e colonna 2: > m[ 1 , 2 ] [1] 4 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 20 / 55 Array e Matrici Gli array sono estensioni multidimensionali di vettori. Per accedere o modificare un elemento di un array tridimensionale sono necessari 3 indici. Gli array possono avere dimensione arbitraria limitatamente alla dimensione della memoria. Le matrici sono array bidimensionali. Sugli array sono applicabili le medesime operazioni di accesso e modifica viste per i vettori ma estese a più dimensioni. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 21 / 55 Matrici Le matrici sono array bidimensionali. 1 4 7 2 5 8 3 6 9 Gli elementi di una matrice sono selezionati tramite una coppia di indici racchiusi fra parentesi quadre. Detta m la matrice di sopra: per selezionare l’elemento nella riga 1 e colonna 2: > m[ 1 , 2 ] [1] 4 per selezionare l’elemento nella riga 3 e colonna 3: > m[ 3 , 3 ] [1] 9 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 22 / 55 Costruzione di matrici La funzione matrix() permette di creare una matrice m a partire da un vettore esistente v, assegnando i valori per colonna. > v <− 1 : 1 2 > m <− m a t r i x ( v , nrow =3) > m [ ,1] [ ,2] [ ,3] [ ,4] [1 ,] 1 4 7 10 [2 ,] 2 5 8 11 [3 ,] 3 6 9 12 La funzione length() restituisce il numero degli elementi nella matrice. > l e n g t h (m) [ 1 ] 12 La funzione mode() visualizza il tipo dei dati. > mode (m) [ 1 ] ” numeric ” La funzione dim() restituisce le dimensioni della matrice, riportando prima il numero di righe e poi quello delle colonne. > dim (m) [1] 3 4 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 23 / 55 Costruzione di matrici La funzione matrix() possiede diversi parametri. > v <− 1 : 1 2 > m <− m a t r i x ( v , > m [ ,1] [ ,2] [ [1 ,] 1 5 [2 ,] 2 6 [3 ,] 3 7 [4 ,] 4 8 n c o l =3) ,3] 9 10 11 12 L’argomengo byrow=T permette di inserire gli elementi per riga. > m <− m a t r i x ( 1 : 1 2 , n c o l =3 , byrow=T) > m [ ,1] [ ,2] [ ,3] [1 ,] 1 2 3 [2 ,] 4 5 6 [3 ,] 7 8 9 [4 ,] 10 11 12 Verificare come risulta la matrice m se si mette ncol=5. Vale ancora la regola del riciclo. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 24 / 55 Costruzione di matrici La funzione cbind() forma matrici legando insieme vettori o matrici per colonna. v1 <− 1 : 3 v2 <− 4 : 6 m <− c b i n d ( v1 , v2 ) m v1 v2 [1 ,] 1 4 [2 ,] 2 5 [3 ,] 3 6 > > > > Verificare come risulta la matrice m se si mettono vettori di lunghezza diversa. Vale ancora la regola del riciclo. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 25 / 55 Costruzione di matrici La funzione rbind() forma matrici legando insieme vettori o matrici per riga. v1 <− 1 : 3 v2 <− 4 : 6 m <− r b i n d ( v1 , v2 ) m [ ,1] [ ,2] [ ,3] v1 1 2 3 v2 4 5 6 > > > > Verificare come risulta la matrice m se si mettono vettori di lunghezza diversa. Vale ancora la regola del riciclo. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 26 / 55 Operazioni aritmetiche con matrici Somma e prodotto con costanti. > v<−1 : 4 > M<−m a t r i x ( v , nrow =2) >M [ ,1] [ ,2] [1 ,] 1 3 [2 ,] 2 4 > M+2 [ ,1] [ ,2] [1 ,] 3 5 [2 ,] 4 6 > M∗2 [ ,1] [ ,2] [1 ,] 2 6 [2 ,] 4 8 Elisabetta Ronchieri Somma e prodotto tra matrici elemento per elemento. > M+M [1 ,] [2 ,] > M∗M [1 ,] [2 ,] [ ,1] [ ,2] 2 6 4 8 [ ,1] [ ,2] 1 9 4 16 Modulo III.1 - Strutture Dati 7 Novembre 2016 27 / 55 Accesso agli elementi di un array e matrice Le regole di accesso per array e matrici seguono quelle viste per i vettori, considerando l’esistenza di più indici e quindi la possibilità di utilizzare un vettore per ogni dimensione: Vettori di indici interi positivi; Vettore di indici interi negativi; Vettore di indici logici; Vettori di indici a caratteri. Si utilizza un vettore di indici per ogni dimensione dell’array. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 28 / 55 Accesso agli elementi di una matrice > m <− m a t r i x ( 1 : 1 2 , nrow =2) > m [ ,1] [ ,2] [ ,3] [ ,4] [ ,5] [ ,6] [1 ,] 1 3 5 7 9 11 [2 ,] 2 4 6 8 10 12 > # e l . r i g a 1 , colonna 2 > m[ 1 , 2 ] [1] 3 > # e l . riga 1 , colonne 3 e 4 > m [1 ,3:4] [1] 5 7 > # righe 1 e 2 , colonne 4 , 5 e 6 > m [1:2 ,4:6] [ ,1] [ ,2] [ ,3] [1 ,] 7 9 11 [2 ,] 8 10 12 > # tutti gli el . della riga 1 > m[ 1 , ] [1] 1 3 5 7 9 11 > # t u t t i g l i e l . colonna 3 > m[ , 3 ] [1] 5 6 > # t u t t i g l i e l . colonne 1 , 2 e 6 > m[ , c ( 1 , 2 , 6 ) ] [ ,1] [ ,2] [ ,3] [1 ,] 1 3 11 [2 ,] 2 4 12 Elisabetta Ronchieri > # e s c l u s i o n e colonna 4 > m[ , −4] [ ,1] [ ,2] [ ,3] [ ,4] [ ,5] [1 ,] 1 3 5 9 11 [2 ,] 2 4 6 10 12 > # el . > 4 > m[m>4] [1] 5 6 7 8 9 10 11 12 > # a s s e g n a z i o n e d i un nome a l l e c o m p o n e n t i > dimnames (m)< l i s t ( c ( ” r i g a 1 ” , ” r i g a 2 ” ) , + p a s t e ( ” c ” , 1 : 6 , s e p=” ” ) ) > m c1 c2 c3 c4 c5 c6 r i g a 1 1 3 5 7 9 11 r i g a 2 2 4 6 8 10 12 > # vettori indice a caratteri > m[ ” r i g a 1 ” , ” c2 ” ] [1] 3 > m[ ” r i g a 1 ” , ] c1 c2 c3 c4 c5 c6 1 3 5 7 9 11 Modulo III.1 - Strutture Dati 7 Novembre 2016 29 / 55 Creazione di array La funzione array() permette di creare degli array. > > > > > > # 1 parametro co nt ie ne g l i elementi # 2 parametro l e dimensioni : # 4 numero d i r i g h e , 2 numero d i c o l o n n e , 3 numero d i m a t r i c i a <− a r r a y ( 2 4 : 4 9 , dim=c ( 4 , 2 , 3 ) ) # 1 matrice a [ , ,1] [ ,1] [ ,2] [1 ,] 24 28 [2 ,] 25 29 [3 ,] 26 30 [4 ,] 27 31 > # 2 r i g a per tutte l e matrice per colonna > a [2 , ,] [ ,1] [ ,2] [ ,3] [1 ,] 25 33 41 [2 ,] 29 37 45 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 30 / 55 Esercizi 1 Costruire una matrice m1 5X5 composta da numeri casuali in almeno 2 modi diversi utilizzando le funzioni matrix() ed array(). 2 Costruire 2 matrici di caratteri a piacere m2 e m3, la prima di dimensione 3X3, la seconda di dimensione 2X3. Modificare con un unico assegnamento la matrice m2 in modo da sostituire le sue 2 prime colonne con le ultime 2 righe di m3. 3 Costruire due matrici m4 e m5 che abbiano entrambe 3 colonne. Costruire, se possibile, tramite rbind() una matrice m6 di 3 colonne che abbia come righe le righe di entrambe le matrici. Utilizzando m4 e m5, è possibile costruire una matrice m7 tramite cbind()? 4 Costruire una matrice m di 5 colonne con la sequenza di numeri da 1 a 11.5 con passo 0.5 inseriri per riga. Sommare ai valori nella terza riga il numero 1. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 31 / 55 Fattori I fattori sono strutture dati per indicare variabili di tipo vettore nominato in grado di rappresentare informazioni di tipo categorico o qualitativo. I diversi valori sono collocati all’interno di livelli, usati per raggruppare i dati. I livelli possono essere rappresentati da sigle (come ”A” o ”B”) o da stringhe (come ”Alto” o ”Basso”) o da codici numerici. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 32 / 55 Fattori Supponiamo di avere dati sulle Università italiane. Di seguito ne sono riportate alcune. Nome UniFer UniBo Bocconi Categoria Pubblica Pubblica Privata I dati contengono due variabili: il nome della Università e la categoria. Il nome è un dato univoco che caratterizza ogni singola Università (non si usa come criterio di raggruppamento). La categoria, al contrario, è una variabile che può assumere solo due valori (Pubblica o Privata) e consente di suddividere le Università in due gruppi. Le variabili nome e categoria sono caratteri, ma solo la variabile categoria può essere un fattore. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 33 / 55 Costruzione di fattori La funzione factor() permette di creare un fattore. > f <− f a c t o r ( r e p ( c ( ” e u r o ” , ” d o l l a r o ” ) , c ( 3 , 4 ) ) ) > f [ 1 ] euro euro euro dollaro dollaro dollaro Levels : d o l l a r o euro > # dollaro \‘e nella posizione 1 > # euro \ ‘ e n e l l a p o s i z i o n e 2 dollaro La funzione level() visualizza solo i livelli del fattore. > levels ( f ) [ 1 ] ” d o l l a r o ” ” euro ” La funzione str() visualizza in modo succinto la struttura dati di un oggetto. > str ( f ) F a c t o r w/ 2 l e v e l s ” d o l l a r o ” , ” e u r o ” : 2 2 2 1 1 1 1 La funzione summary() fornisce una tabella della frequenze dei due livelli euro e dollaro. > summary ( f ) dollaro euro 4 3 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 34 / 55 Operazioni logiche sui fattori Partendo dal fattore f. > f <− f a c t o r ( r e p ( c ( ” e u r o ” , ” d o l l a r o ” ) , c ( 3 , 4 ) ) ) > f [ 1 ] euro euro euro dollaro dollaro dollaro Levels : d o l l a r o euro dollaro Le operazioni logiche possono essere applicate per estrarre informazioni legate ai livelli. > f [ f==” e u r o ” ] [ 1 ] euro euro euro Levels : d o l l a r o euro > f [ f !=” e u r o ” ] [1] dollaro dollaro dollaro dollaro Levels : d o l l a r o euro > f [ f>” e u r o ” ] [ 1 ] <NA> <NA> <NA> <NA> <NA> <NA> <NA> Levels : d o l l a r o euro Warning m e s s a g e : I n Ops . f a c t o r ( f , ” e u r o ” ) : > not meaningful f o r f a c t o r s Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 35 / 55 Esercizi 1 Costruire un fattore di 12 elementi (stringhe), caratterizzato da 3 diversi livelli. 2 Costruire un fattore ordinato di 15 elementi di livelli basso < medio < alto. 3 Quali strutture dati si potrebbero scegliere per modellare un data set caratterizzato da un insieme di clienti di una banca morosi e non sottoposti a 5 diversi tipi di analisi? Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 36 / 55 Lista Le liste rappresentano un insieme ordinato di oggetti (componenti). Le componenti possono non essere dello stesso tipo o modo. Quindi le liste rappresentano insiemi di oggetti eterogenei. I componenti possono essere: un vettore numerico, un valore logico, una matrice, un array di caratteri, una funzione o un’altra lista. La lista è una struttura dati ricorsiva, poichè una sua componente può essere a sua volta una lista (e la lista componente può avere come componente un’altra lista). Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 37 / 55 Lista come insieme ordinato di oggetti eterogenei Rappresentazione di una lista composta da oggetti eterogenei: un valore logico, un vettore di interi, un’altra lista ed una matrice di caratteri. valore vettore logico di interi lista matrice di caratteri Elisabetta Ronchieri T | 1 | 5.6 | A D G 2 0 5 4 − BC B C E F H I Modulo III.1 - Strutture Dati 7 Novembre 2016 38 / 55 Costruzione di una lista La funzione list() permette di creare una lista. I componenti delle liste sono sempre numerati. > l<− l i s t (T , c ( 1 , 2 , 0 ) ) > l [[1]] [ 1 ] TRUE [[2]] [1] 1 2 0 Elisabetta Ronchieri È possibile assegnare alle componenti un nome: > l<− l i s t ( l o=T , v=c ( 1 , 2 , 0 ) ) > l $lo [ 1 ] TRUE $v [1] 1 2 0 Modulo III.1 - Strutture Dati 7 Novembre 2016 39 / 55 Accesso alle componenti di una lista Esistono tre modalità di accesso alle componenti di una lista: 1 accesso tramite indice numerico racchiuso fra doppie parentesi quadre; 2 accesso tramite il nome delle componenti; 3 accesso tramite indice a caratteri. Accedere alle componenti tramite gli operatori [[]] e [] produce risultati sostanzialmente differenti. Operatore [[]] seleziona l’oggetto contenuto nella lista escludendo l’eventuale nome associato all’oggetto. Operatore [] seleziona una sottolista, riferendosi ad un elemento di modo list, ed includendo l’eventuale nome associato all’oggetto. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 40 / 55 Accesso alle componenti di una lista Supponiamo di avere la seguente lista l. > l <− l i s t ( l o=T , + v=c ( 1 , 2 , 0 , 4 , 3 ) , + m=m a t r i x ( 1 : 4 , nrow =2)) > l $lo [ 1 ] TRUE $v [1] 1 2 0 4 3 Accesso tramite indice a caratteri: > l [ [ ”m” ] ] [ ,1] [ ,2] [1 ,] 1 3 [2 ,] 2 4 $m [1 ,] [2 ,] [ ,1] [ ,2] 1 3 2 4 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 41 / 55 Accesso alle componenti di una lista Supponiamo di avere la seguente lista l. > l <− l i s t ( l o=T , + v=c ( 1 , 2 , 0 , 4 , 3 ) , + m=m a t r i x ( 1 : 4 , nrow =2)) > l $lo [ 1 ] TRUE $v [1] 1 2 0 4 3 $m [1 ,] [2 ,] [ ,1] [ ,2] 1 3 2 4 Elisabetta Ronchieri Accesso tramite il nome delle componenti: > l $lo [ 1 ] TRUE > l $v [1] 1 2 0 4 3 Tramite la notazione lista$nome è possibile accedere anche ai singoli elementi delle componenti: > l $v [ 4 ] [1] 4 > l $m[ 1 , 1 ] [1] 1 Modulo III.1 - Strutture Dati 7 Novembre 2016 42 / 55 Accesso alle componenti di una lista Supponiamo di avere la seguente lista l. > l <− l i s t ( l o=T , + v=c ( 1 , 2 , 0 , 4 , 3 ) , + m=m a t r i x ( 1 : 4 , nrow =2)) > l $lo [ 1 ] TRUE $v [1] 1 2 0 4 3 > l [1] > l [1] > l [[1]] TRUE [[2]] 1 2 0 4 3 [[3]] [ ,1] [ ,2] [1 ,] 1 3 [2 ,] 2 4 l[[1]] è equivalente a l$lo. $m [1 ,] [2 ,] Accesso tramite indice numerico: [ ,1] [ ,2] 1 3 2 4 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 43 / 55 Concatenare liste La funzione c() permette di concatenare delle liste. > l4 [[1]] [ 1 ] ” Corso ” > > > > l 1<− l i s t l 2<− l i s t l 3<− l i s t l 4<−c ( l 1 ( ” C o r s o ” , ” a . a . 2016 / 2017 ” ) (” Prof ”) (” Orario Lezione ”) , l2 , l 3 ) [[2]] [ 1 ] ” a . a . 2016 / 2017 ” [[3]] [ 1 ] ” Prof ” [[4]] [ 1 ] ” Orario Lezione ” Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 44 / 55 Esercizi 1 2 Costruire una lista l1 composta da una matrice numerica 4X4, da un vettore di caratteri con 32 elementi, dalla stringa ”euro”, e da una ulteriore lista composta da un vettore di 10 elementi numerici e dal valore logico FALSE. Estrarre dalla lista l2 cosı̀ costruita list(m=matrix(rnorm(64), nrow=8), s=c(rep(”A”,3), rep(”B”,5))) la seconda colonna della matrice; le ”B” del vettore s. Si aggiunga quindi alla lista un vettore composto da 10 numeri casuali. 3 Accedere in 3 modi diversi alla seconda componente della lista l2. 4 Spiegare la differenza fra le due diverse modalità di accesso al primo elemento della lista l2, usando singola [] e doppia [[]]. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 45 / 55 Data Frame Un data frame può essere considerato come una matrice le cui colonne rappresentano dati eterogenei. Dati Dato1 Dato2 Dato3 Dato4 Dato5 val.num. 3.4 5.6 6.7 8.9 9 val.car . AB BC CD DE EF val.log . TRUE FALSE FALSE TRUE FALSE val.num. 0.1 1.2 2.3 3.4 4.5 val.car . FG GH HI IL LM Formalmente è una lista di classe data.frame. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 46 / 55 Data Frame Le colonne del data frame rappresentano variabili i cui modi ed attributi possono essere differenti. Le matrici (array bidimensionale) e gli array sono invece costituiti da elementi omogenei per modo ed attributo. Dati val.num. val.car . Dati val.num. val.num. Dato1 3.4 AB Dato1 3.4 1.2 Dato2 5.6 BC Dato2 5.6 2.3 Dato3 6.7 CD Dato3 6.7 3 Dato4 8.9 DE Dato4 8.9 4 Dato5 9 EF Dato5 9 6.7 Un data frame può essere visualizzato come una matrice e si può accedere ai suoi elementi utilizzando indici (come per le matrici). Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 47 / 55 Componenti del data frame 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 Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 48 / 55 Costruzione di data frame I data frame sono costruiti tramite la funzione data.frame(): > > > > > v1 v2 v3 df df v1 1 1 2 2 3 3 <− <− <− <− v2 5 6 7 1:3 5:7 p a s t e ( ”A” , 1 : 3 , s e p=” ” ) d a t a . frame ( v1 , v2 , v3 ) v3 A1 A2 A3 Elisabetta Ronchieri m <−m a t r i x ( 1 : 6 , nrow =2) v1 <− c ( ”A” , ”B” ) d f 1 <− d a t a . frame (m, v1 ) df X1 X2 X3 v1 1 1 3 5 A 2 2 4 6 B > v2 <− c ( ”A” , ”B” , ”C” ) > d f <− d a t a . frame (m, v2 ) E r r o r i n d a t a . frame (m, v2 ) : a r g u m e n t s i m p l y d i f f e r i n g number o f r o w s : 2 , 3 > > > > Modulo III.1 - Strutture Dati 7 Novembre 2016 49 / 55 Accesso alle componenti e agli elementi di un data frame Esistono due modalità di accesso alle componenti ed agli elementi dei data frame: 1 I data frame sono liste, e quindi è possibile accedere ad essi secondo le modalità di accesso tipiche delle liste stesse: accesso tramite indice numerico; accesso tramite il nome delle componenti; accesso tramite indice a caratteri. 2 Come classe data frame, sono definiti operatori di accesso specifici o vettori di indici con una semantica simile a quella delle matrici e degli array. Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 50 / 55 Accesso alle componenti di un data frame Supponiamo di avere il seguente data frame df. > df v1 v2 v3 1 1 5 A1 2 2 6 A2 3 3 7 A3 Accesso tramite indice a caratteri: > d f [ ” v1 ” ] v1 1 1 2 2 3 3 > d f [ [ ” v1 ” ] ] [1] 1 2 3 Elisabetta Ronchieri Accesso tramite il nome delle componenti: > d f $ v1 [1] 1 2 3 Modulo III.1 - Strutture Dati Accesso tramite indice numerico: > df [ [ 1 ] ] [1] 1 2 3 > df [ 1 ] v1 1 1 2 2 3 3 7 Novembre 2016 51 / 55 Accesso alle componenti di un data frame Supponiamo di avere il seguente data frame df. > df v1 v2 v3 1 1 5 A1 2 2 6 A2 3 3 7 A3 Accesso tramite vettori di indici: > df [ 1 , 2 ] [1] 5 > df [ 2 , 2 : 3 ] v2 v3 2 6 A2 Elisabetta Ronchieri > df [ 3 , ] v1 v2 v3 3 3 7 A3 > df [ 2 : 3 , 1 : 2 ] v1 v2 2 2 6 3 3 7 Modulo III.1 - Strutture Dati 7 Novembre 2016 52 / 55 Estrazione logica di osservazioni dal data frame Supponiamo di avere il seguente data frame df. > df v1 v2 v3 1 1 5 A1 2 2 6 A2 Usare l’operatore > per estrarre da df solo le osservazioni la cui variabile v1 > 1. > d f [ d f $ v1 >1 ,] v1 v2 v3 2 2 6 A2 Equivalentemente si può usare la funzione subset(): > s u b s e t ( df , v1 >1) v1 v2 v3 2 2 6 A2 Se si vogliono selezionare elementi da un insieme si può usare l’operatore %in%: > s u b s e t ( df , v3 %i n% ”A2” ) v1 v2 v3 2 2 6 A2 Elisabetta Ronchieri > s u b s e t ( df , v3%i n%c ( ”A2” , ”A1” ) ) v1 v2 v3 1 1 5 A1 2 2 6 A2 Modulo III.1 - Strutture Dati 7 Novembre 2016 53 / 55 Esercizi 1 Costruire un data frame df1 di 4 righe con 5 variabili di cui 3 numeriche e 2 a caratteri. Su questo estrarre: le variabili pari; le variabili dispari; i dati della 2 riga; i dati della 2 e 3 riga; i dati dell’ultima riga; i dati delle ultime due colonne. 2 Costruire un data frame df2 che abbia come componenti un vettore numerico casuale v di lunghezza 10, una matrice casuale m con 4 colonne ed una lista l i cui componenti siano 2 matrici a piacere. 3 Costruire una lista l che abbia come componenti 2 vettori v1 e v2 entrambi a caratteri. Trasformare la lista in un data frame df3 tramite la funzione as.data.frame(). Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 54 / 55 Documentazione Per ciascuna funzione visionare l’help online di R. Vito M.R. Muggeo e Giancarlo Ferrara, Il Linguaggio R: concetti introduttivi ed esempi, II Edizione, 2005, Cap. 2-3, ftp://cran.r-project.org/pub/R/doc/contrib/nozioniR.pdf W.N. Venables, D. M. Smith and the R Development Core Team, An introduction to R, 2016, Cap. 2-6, https://cran.r-project.org/doc/manuals/R-intro.pdf Quick-R, Data Types, http://statmethods.net/input/datatypes.html Elisabetta Ronchieri Modulo III.1 - Strutture Dati 7 Novembre 2016 55 / 55