Indice
Vettori, arrays, liste
Uno dei vantaggi di linguaggi tipo R rispetto ad altri linguaggi consiste nella gestione compatta di strutture di dati:
• I ‘vettori’ possono contenere solo dati omogenei (numerici o caratteri).
• Gli arrays possono essere estensioni multidimensionali (a molti indici) dei vettori. Il caso a due indici è una matrice
• Le liste sono ‘collezioni ordinate di oggetti’, anche di tipo diverso.
Creazione di un vettore
La struttura dati più semplice disponibile in R è un vettore. È possibile creare vettori di valori numerici, valori logici e stringhe di caratteri utilizzando la funzione c() . Per esempio:
c(1, 2, 3)
[1] 1 2 3
c(TRUE, TRUE, FALSE)
[1] TRUE TRUE FALSE
c(“a”, “b”, “c”)
[1] “a” “b” “c”
Puoi anche unire più vettori usando la funzione c() .
x <- c(1, 2, 5)
y <- c(3, 4, 6)
z <- c(x, y)
z
[1] 1 2 5 3 4 6
con list() :
xl <- list(‘a’ = 5, ‘b’ = 6, ‘c’ = 7, ‘d’ = 8)
e si ottiene:
> xl
$a
[1] 5
$b
[1] 6
$c
[1] 7
$d
[1] 8
Accedere agli elementi di un vettore
Il meccanismo di accesso agli elementi di un vettore è uguale a python: mediante la sintassi a parentesi quadre. Tuttavia, gli indici in R partono da 1:
P <- c(“uno”, “nessuno”, “centomila”)
> P[2]
[1] “nessuno”
• Possiamo specificare degli intervalli di valori utilizzando i due punti, per ricavare i valori del vettore con quegli indici
• Specificando P[n1:n2] otteniamo tutti i valori del vettore P, dall’indice n1 all’indice n2 (compreso)
P[1:2]
[1] “uno”, “nessuno”
• Si può accedere agli elementi di un vettore caratterizzati da specifici indici.
Tali indici devono essere specificati in un vettore creato con c().
> A <- c(10, 100, 1000, 10000, 100000)
> A[ c(2, 4) ]
[1] 100 10000
• Possiamo specificare quali elementi non visualizzare utilizzando indici negativi (semantica ben diversa da python!)
A <- c(1,2,5,6,7,8)
> A
[1] 1 2 5 6 7 8
> A[ -c(2,4) ]
[1] 1 5 7 8
• Possiamo applicare operazioni logiche su tutti gli elementi di un vettore
• Il risultato è un vettore booleano con i risultati
Ad es., possiamo chiedere quali elementi siano maggiori di un certo valore (2) e contemporaneamente minori di un certo valore (7):
> A
[1] 1 2 5 6 7 8
> A>2 & A<7
[1] FALSE FALSE TRUE TRUE FALSE FALSE
• In R si può utilizzare un vettore booleano per decidere quali elementi di un vettore debbano essere utilizzati
• Se l’elemento i-esimo del vettore booleano è TRUE, l’elemento i-esimo del vettore viene utilizzato; altrimenti viene scartato. Combinando le due cose si ottiene:
A[ A>2 & A<7]
[1] 5 6
in alternativa:
V<- c(6,5,3,4,1,6,2,8,1,4,10)
> V
[1] 6 5 3 4 1 6 2 8 1 4 10
cond <- V>5
> V1<- V[cond]
> V1
[1] 6 6 8 10
Vettori da costruire in costanti: Sequenze di lettere e nomi dei mesi.
R ha un numero di costanti costruite. Sono disponibili le seguenti costanti:
LETTERS : le 26 lettere maiuscole dell’alfabeto romano
letters : le 26 lettere minuscole dell’alfabeto romano
month.abb : le abbreviazioni di tre lettere per i nomi dei mesi inglesi
month.name : i nomi inglesi per i mesi dell’anno
pi : il rapporto tra la circonferenza di un cerchio e il suo diametro
I vettori possono essere creati dalle costanti precedentemente definite.
1) Sequenze di lettere:
> letters
[1] “a” “b” “c” “d” “e” “f” “g” “h” “i” “j” “k” “l” “m” “n” “o” “p” “q” “r” “s” “t” “u” “v” “w” “x” “y” “z”
> LETTERS[7:9]
[1] “G” “H” “I”
> letters[c(1,5,3,2,4)]
[1] “a” “e” “c” “b” “d”
2) Sequenze di abbreviazioni del mese o nomi di mesi:
> month.abb
[1] “Jan” “Feb” “Mar” “Apr” “May” “Jun” “Jul” “Aug” “Sep” “Oct” “Nov” “Dec”
> month.name[1:4]
[1] “January” “February” “March” “April”
month.abb[c(3,6,9,12)]
[1] “Mar” “Jun” “Sep” “Dec”
Assegnare nomi ai vettori.
Possiamo assegnare dei “nomi” agli elementi di un vettore con la funzione names() e recuperare i valori utilizzando tali nomi:
S <- c( “giovanni”, “Rossi”, “Milano”)
> S
[1] “giovanni” “Rossi” “Milano”
> names(S) <- c(“Nome”, “Cognome”, “Città”)
> S
Nome Cognome Città
“giovanni” “Rossi” “Milano”
S
Nome Cognome Città
“giovanni” “Rossi” “Milano”
> S[“Nome”]
Nome
“giovanni”
Operazioni vettoriali.
• In maniera molto simile a python e numpy, possiamo utilizzare i vettori per effettuare delle operazioni vettoriali (ad es., la somma)
> A <- c(1,2,3,4,5)
> B <- c(9,8,7,6,5)
> A+B
[1] 10 10 10 10 10
• A differenza di numpy, che si arrabbia tantissimo, con R possiamo sommare vettori di lunghezza diversa
• R risolve il problema “allungando” il vettore più corto, “riciclando” i numeri precedenti
• ATTENZIONE! R non stampa alcun messaggio nel caso in cui la lunghezza del vettore più lungo è un multiplo di quello più corto
> C <- c(9,8)
> A+C
[1] 10 10 12 12 14
Warning message:
In A + C : longer object length is not a multiple of shorter object length
Riflettete sul perché si ottenga questo risultato
Altre funzioni utili sui vettori.
• length(V): restituisce la lunghezza del vettore V
• mode(V): restituisce il tipo di dato usato dal vettore V
• sort(V): restituisce la versione ordinata del vettore V
• order(V): restituisce i nuovi indici degli elementi dopo un ordinamento
• rev(V): restituisce il vettore invertito.
vett<- c(6,5,3,4,1,6,2,8,1,4,10)
> sort(vett)
[1] 1 1 2 3 4 4 5 6 6 8 10
> mode(vett)
[1] “numeric”
> length(vett)
[1] 11
> order(vett)
[1] 5 9 7 3 4 10 2 1 6 8 11
> rev(vett)
[1] 10 4 1 8 2 6 1 4 3 5 6
Altre funzioni vettoriali utili.
• min(V), max(V): restituiscono, rispettivamente, il valore minimo e massimo contenuti nel vettore V
• range(V): restituisce c(min(V), max(V))
• sum(V), prod(V): restituiscono, rispettivamente, la somma e il prodotto di tutti i valori in V
• median(V): restituisce la mediana del vettore V
• mean(V), var(V), sd(V): restituiscono, rispettivamente, la media aritmetica, la varianza e la deviazione standard dei valori contenuti in V.
summary(V): minimo, 1°quartile, mediana, media, 3°quartile, massimo di V
quantile(V,0.05): quantile al 5% di V ( probs = 0.05)
• Note 1: Equivale alla funzione median() quando probs = 0.5.
• Note 2: Equivale alla funzione min() quando probs = 0.
• Note 3: Equivale alla funzione max() quando probs = 1.
V<- c(6,5,3,4,1,6,2,8,1,4,10)
> V
[1] 6 5 3 4 1 6 2 8 1 4 10
> min(V)
[1] 1
> max(V)
[1] 10
> range(V)
[1] 1 10
> sum(V)
[1] 50
> prod(V)
[1] 1382400
> mean(V) # media aritmetica
[1] 4.545455
> var(V) #varianza
[1] 8.072727
> sd(V) #deviazione standard
[1] 2.841255
quantile(V, probs = 0.25)
25%
2.5
summary(V)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.500 4.000 4.545 6.000 10.000
> median (V)
[1] 4
Le successive funzioni sono presenti nel pacchetto labstatR scaricabile qui:
oppure dalla stesso ambiente Rgui:
• meang(V): restituisce la media geometrica del vettore V
Esempio media geometrica:
> x <- c(1.2, 2.3, 4.5, 6.5)
> n <- 4
> prod(x)^(1/n)
[1] 2.997497
> meang(x) # otteniamo lo stesso risultato!
[1] 2.997497
• meana(V): restituisce la media armonica del vettore V
Esempio media armonica:
> x <- c(1.2, 2.3, 4.5, 6.5)
> 1/mean(1/x)
[1] 2.432817
> meana(x)
[1] 2.432817
(607)