Questa è la prima lezione del laboratorio di Probabilità e Statistica in R, al sito http://calvino.polito.it/~gasparin/teaching/labI.txt Iniziare e chiudere una sessione di R, fare una lista degli oggetti ------------------------------------------------------------------- Abbiamo già visto come usare l'icona e come uscire usando il comando > q() > # questo è un commento e non ha alcun effetto Per controllare cosa c'e' disponibile nella directory corrente: > ls() [1] ".Last.value" ...... Per eliminare un oggetto, usa rm(). > thing <- 2 > rm(thing) > thing Error: Object "thing" not found Semplice aritmetica ------------------- In R, qualunque cosa venga scritta al prompt viene valutata: > 1+2+3 [1] 6 > 2+3*4 [1] 14 > 3/2+1 [1] 2.5 > 2+(3*4) [1] 14 > (2 + 3) * 4 [1] 20 > 4*3**3 Usa ** o ^ per calcolare un elevamento a potenza. [1] 108 R fornisce anche tutte le funzioni che si trovano su un calcolatore tascabile: > sqrt(2) [1] 1.414214 > sin(3.14159) # sin(Pi greco) e' zero [1] 2.65359e-06 # e questo e' vicino... Fornisce anche il valore di Pi greco: > sin(pi) [1] 1.224606e-16 # ancora piu' vicino a zero... Ecco una breve lista di funzioni Nome Operazione sqrt radice quadrata abs valore assoluto sin cos tan funzioni trigonometriche asin acos atan funzioni trigonometriche inverse exp log exponenziale e logaritmo naturale Le funzioni possono essere annidate: > sqrt(sin(45*pi/180)) [1] 0.8408964 Assegnazioni di valori --------------------- Si puo' salvare un valore assegnandolo ad un oggetto mediante il simbolo <- o _ (sconsigliato, anche se piú veloce, perchè difficile da leggere): > x <- sqrt(2) # salva in x la radice quadrata di 2 > x [1] 1.414214 > x**3 [1] 2.828427 Valori logici ------------- R permette di gestire operazioni e variabili logiche: > x <- 10 # fissa x uguale a 10 > x > 10 # x e' piu' grande di 10? [1] F # l'espressione di sopra ha il valore logico di falso (F) > x <= 10 [1] T > tf <- x > 10 > tf [1] F Creazione di vettori -------------------- Per creare un vettore, si usa la funzione c(): > x <- c(2,3,5,7,11) > x [1] 2 3 5 7 11 Se si hanno tanti dati da scrivere, puo' essere piu' conveniente usare scan(): > x <- scan() 1: 1 2: 6 3: 3 4: 4 5: > x [1] 1 6 3 4 > x <- scan() 1: 23 34 32 4: 33 88 44 Esercizio: scan() puo' anche servire per leggere un vettore da un file. Con un editor, prova a creare il file di testo "data.dat" contenente i seguenti dati: 243 251 275 291 347 354 380 392 206 210 226 249 255 273 289 295 309 241 258 270 293 Puoi leggere il vettore con il comando: > redcell <- scan("data.dat") Successioni ----------- Si puo' usare la notazione a:b per creare vettori che sono sequenze di numeri: > xx <- 1:10 > xx [1] 1 2 3 4 5 6 7 8 9 10 Prova > xx <- 100:1 Possono anche essere creati dei vettori che contengono elementi ripetuti > rep(2,times=3) [1] 2 2 2 > rep(2,3) [1] 2 2 2 > a_c(rep(2,3),4,5,rep(1,5)) > a [1] 2 2 2 4 5 1 1 1 1 1 Ai vettori puo' essere applicata la stessa aritmetica di base che e' stata applicata ai valori scalari: > x <- 0:10 > x*2 [1] 0 2 4 6 8 10 12 14 16 18 20 > y <- -5:5 > x*y [1] 0 -4 -6 -6 -4 0 6 14 24 36 50 # R qui fa il prodotto # componente per componente Possono essere eseguite operazioni logiche anche sui vettori > x > 5 [1] F F F F F F T T T T T Estrazione degli elementi da un vettore --------------------------------------- Gli elementi di un vettore possono essere estratti usando le parentesi quadre []: > xx[7] [1] 94 Si possono estrarre anche sottoinsiemi di elementi: > xx[c(2,3,5,7,11)] [1] 99 98 96 94 90 > xx[85:91] [1] 16 15 14 13 12 11 10 > xx[91:85] [1] 10 11 12 13 14 15 16 > xx[c(1:5,8:10)] [1] 100 99 98 97 96 93 92 91 > xx[c(1,1,1,1,2,2,2,2)] [1] 100 100 100 100 99 99 99 99 Ovviamente, sottoinsiemi di elementi possono essere salvati in nuovi vettori: > yy <- xx[c(1,2,4,8,16,32,64)] > yy [1] 100 99 97 93 85 69 37 Se le parentesi quadre racchiudono un numero NEGATIVO, l'elemento corrispondente viene OMESSO dal vettore risultante: > x <- c(1,2,4,8,16,32) > x [1] 1 2 4 8 16 32 > x[-4] [1] 1 2 4 16 32 Alcune funzioni utili per la manipolazione di vettori > x <- 3:26 > length(x) [1] 24 ...il numero di elementi > max(x) [1] 26 ...il massimo > min(x) [1] 3 ...il minimo > sum(x) [1] 348 ...la somma dei valori in x > prod(x) [1] 2.016457e+26 ...il prodotto dei valori in x > mean(x) [1] 14.5 ...la media aritmentica : sum(x)/length(x) Vettori particolari: gli indicatori di categoria o fattori ---------------------------------------------------------- Supponi di avere un esperimento con 6 soggetti, due dei quali ricevono il trattamento "a", tre quello "b" ed uno il trattamento "c". Per salvare questa informazione possiamo creare un fattore: > treat <- factor(c('a','b','b','c','a','b')) > treat [1] a b b c a b Per vedere il nome delle categorie contenute nel fattore treat usiamo levels(): > levels(treat) [1] "a" "b" "c" Supponiamo che gli esiti dell'esperimento sui 6 individui sia il seguente: > risposta <- c(10,3,7,6,4,5) allora possiamo trovare gli esiti per un particolare trattamento con il comando: > risposta[treat=="a"] [1] 10 4 > risposta[treat=="b"] [1] 3 7 5 Matrici ------- R consente anche di usare le matrici: > x <- matrix(c(2,3,5,7,11,13),ncol=2) > x [,1] [,2] [1,] 2 7 [2,] 3 11 [3,] 5 13 Notare che R legge i dati di una matrice per COLONNA. Tale comportamento si può invertire con la opportuna opzione byrow=T (provare). Bisogna specificare nrow e/o ncol per comunicare a R la dimensione della matrice. Se gli elementi di una matrice sono contenuti in un file, possiamo usare ancora scan(): 1,24,32,36,33 2,16,44,34,33 3,20,31,43,32 4,23,35,37,35 5,27,40,40,31 6,19,43,32,37 Vogliamo mettere questi elementi in una matrice 6X5: > x <- scan("matdata",sep=',') > mx <- matrix(x,ncol=5, byrow=T) > mx [,1] [,2] [,3] [,4] [,5] [1,] 1 24 32 36 33 [2,] 2 16 44 34 33 [3,] 3 20 31 43 32 [4,] 4 23 35 37 35 [5,] 5 27 40 40 31 [6,] 6 19 43 32 37 Per estrarre da una matrice un elemento, bisogna specificarne le due coordinate: > mx[2,1] [1] 2 > mx[2,2] [1] 16 Se non si mette una delle coordinate, si ottiene una intera riga/colonna (ricordarsi però la virgola!) > mx[,1] [1] 1 2 3 4 5 6 > mx[3,] [1] 3 20 31 43 32 Possono essere estratti sottoinsiemi di righe e/o colonne: > x <- matrix(1:16,ncol=4) > x [,1] [,2] [,3] [,4] [1,] 1 5 9 13 [2,] 2 6 10 14 [3,] 3 7 11 15 [4,] 4 8 12 16 > x[c(1,4),c(3,4)] # Riga 1 e 4, [,1] [,2] # Col 3 e 4 [1,] 9 13 [2,] 12 16 Data-frames ----------- Un data frame (chiamato a volte matrice dei dati) e' un oggetto simile ad una matrice, ma usato per rappresentare dati sperimentali. Ogni riga rappresenta una unita' statistica, ogni colonna rappresenta una variabile misurata sulle unita' statistiche. Le colonne possono contenere variabili numeriche o categoriali. Per leggere un insieme di dati di questo tipo si usa la funzione read.table(), che automaticamente controlla se le variabili sono numeriche o qualitative, se le righe e/o le colonne hanno etichette. Supponi che il file exams.txt sia cosi' costituito: name age mark1 mark2 mark3 1 arthur 21 78 77 56 2 barry 22 85 65 81 3 charlie 19 56 66 85 4 dave 22 75 75 54 Possiamo acquisirlo con il comando: > students <- read.table("exams.txt") R nota che la prima riga ha un elemento in meno delle altre; quindi interpreta la prima riga come una riga di etichette per le colonne. Si possono cambiare le etichette con il comando: > names(students) <- c('name','age','test1','test2','test3') Utilizziamo il comando attach() per comunicare ad R che le operazioni che faremo si riferiscono al dataframe students: > attach(students) > students name age mark1 mark2 mark3 mark4 1 arthur 21 78 77 56 58 2 barry 22 85 65 81 76 3 charlie 19 56 66 85 66 4 dave 22 75 75 54 65 5 eric 20 66 45 73 74 Per avere delle statistiche di base sulle variabili contenute in students possiamo usare la funzione summary(): > summary(students) ..................... Per estrarre elementi da un data frame valgono le stesse regole valide per le matrici. > mark1 [1] 78 85 56 75 66 > students[mark1 > 70,] # estrae un dataframe... name age mark1 mark2 mark3 mark4 # ...di studenti che... 1 arthur 21 78 77 56 58 # ... hanno > 70 in test 1 2 barry 22 85 65 81 76 4 dave 22 75 75 54 65