Vettori

Strutture Dati

  • vettori

  • fattori

  • liste

  • matrici

  • array

  • dataframe

Vettori

I vettori sono una struttura dati unidimensionale e sono la più semplice presente in R.

Caratteristiche di un vettore

  • la lunghezza: il numero di elementi da cui è formato il vettore

  • la tipologia: la tipologia di dati da cui è formato il vettore. Un vettore infatti deve esssere formato da elementi tutti dello stesso tipo!

Caratteristiche degli elementi di un vettore

  • un valore: il valore dell’elemento che può essere di qualsiasi tipo ad esempio un numero o una serie di caratteri

  • un indice di posizione: un numero intero positivo che identifica la sua posizione all’interno del vettore.

Creare un vettore

I vettori si possono creare attraverso il comando c(), indicando tra le parentesi i valori degli elementi nella sucessione desiderata e separati da una virgola.

num_vect = c(1,2,3,4)
# è possibile anche utilizzare la funzione seq()
num_vect_seq = seq(from = 1,to = 4, by = 1)
num_vect
[1] 1 2 3 4
num_vect_seq
[1] 1 2 3 4
char_vect = c("R","R","R","ok")
# è possibile anche utilizzare la funzione rep()
char_vect_rep = c(rep("R", times = 3), "ok")
char_vect
[1] "R"  "R"  "R"  "ok"
char_vect_rep
[1] "R"  "R"  "R"  "ok"

Tiplogia di vettore

La tipologia di dati da cui è formato il vettore.

class(num_vect)
[1] "numeric"
class(char_vect)
[1] "character"

Tiplogia di vettore

Un vettore deve esssere formato da elementi tutti dello stesso tipo!

wrong = c(1,2,3,"non so", 4)
class(wrong) 
[1] "character"
wrong
[1] "1"      "2"      "3"      "non so" "4"     

Altrimenti si “rischia” che tutto venga trasformato a carattere.

correct = c(1,2,3,NA, 4)
class(correct) 
[1] "numeric"
correct
[1]  1  2  3 NA  4

is.* & as.*

Possiamo testare o convertire (quando possibile) la tipologia del vettore attraverso queste funzioni is. & as.

Vettore di tipo character

char_vect
[1] "R"  "R"  "R"  "ok"
is.character(char_vect)
[1] TRUE
as.numeric(char_vect) #!!
[1] NA NA NA NA

is.* & as.*

Vettore di tipo numeric

num_vect
[1] 1 2 3 4
is.numeric(num_vect)
[1] TRUE
as.character(num_vect) #!!
[1] "1" "2" "3" "4"

Vettore di tipo logical

logi_vect = c(TRUE,FALSE,TRUE)
is.logical(logi_vect)
[1] TRUE
as.numeric(logi_vect)
[1] 1 0 1

Attributi del vettore

Ogni elemento del vettore può essere associato ad un nome.

num_vect
[1] 1 2 3 4
names(num_vect) #nessun nome associato
NULL
letters[1:4]
[1] "a" "b" "c" "d"
names(num_vect) = letters[1:4]

num_vect
a b c d 
1 2 3 4 

Ogni vettore è caraterizzato da una dimensione (dim()), in realtà essendo il vettore unidimensionale usiamo il comando length() per ottenere la lunghezza del vettore

num_vect
a b c d 
1 2 3 4 
dim(num_vect)
NULL
length(num_vect)
[1] 4

Indicizzazione

Possiamo selezionare, eliminare, estrarre elementi semplicemente usando l’indice di posizione tramite le parentesi quadre vettore[pos] .

# Creo un vettore formato da 10 numeri casuali pescati da 1 a 100
my_vect = round(runif(n = 10,min = 1, max = 100))
my_vect
 [1] 47 42 91 15 74 98 88 13 55 15
my_vect[1] # estraggo il primo elemento
[1] 47
my_vect[1:5] # estraggo i primi 5 elementi
[1] 47 42 91 15 74
my_vect[c(1,4,2,9)] # estraggo elementi a scelta
[1] 47 15 42 55
my_vect[length(my_vect)] #ultimo elemento (perchè?)
[1] 15

Inidicizzazione Negativa

Allo stesso modo possiamo decidere di estrarre tutti gli elementi del vettore eccetto alcuni

my_vect[-c(1)] #tutti tranne il primo elemento
[1] 42 91 15 74 98 88 13 55 15
my_vect[-c(1:9)] #tutti tranne i primi 10
[1] 15

Se assegnamo nomi agli elementi del vettore, possiamo indicizzare questi “chiamandoli per nome” (meno comune)

letters[1:length(my_vect)]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
names(my_vect) = letters[1:length(my_vect)]
names(my_vect) # Che nomi hanno gli elementi di my_vec?
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
my_vect 
 a  b  c  d  e  f  g  h  i  j 
47 42 91 15 74 98 88 13 55 15 
my_vect["a"] # voglio l'elemento di my_vec chiamato "a"
 a 
47 
my_vect[1] # voglio il primo elemento di my_vec
 a 
47 

Indicizzazione Logica

Possiamo selezionare elementi dal vettore basandoci su specifiche condizioni logiche: TRUE e FALSE. L’idea è che se abbiamo un vettore di lunghezza n e un’altro vettore logico di lunghezza n, tutti gli elementi TRUE saranno selezionati:

numeri = 1:7
numeri
[1] 1 2 3 4 5 6 7
numeri>2 & numeri<5
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
numeri[numeri>2 & numeri<5]
[1] 3 4
as.numeric(numeri>2 & numeri<5)
[1] 0 0 1 1 0 0 0

Non vale solo per elementi del vettore numeri ma per qualsiasi vettore!

lettere = letters[1:7]
lettere
[1] "a" "b" "c" "d" "e" "f" "g"
numeri>2 & numeri<5
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
lettere[numeri>2 & numeri<5]
[1] "c" "d"

Indicizzazione Interna

Attraverso la funzione which() possiamo ottenere la posizione associata ad una selezione logica:

lettere
[1] "a" "b" "c" "d" "e" "f" "g"
which(lettere == "a")
[1] 1

Indicizzazione Interna

Esempio:

# creo un vettore di 10 numeri interi casuali tra 1 e 40
my_vect = round(runif(10, min = 1, max = 40))
my_vect
 [1]  1 30 30 26 35  7 37 23 36 31

Cosa cambia tra questi 2 comandi?

which(my_vect > 20)
[1]  2  3  4  5  7  8  9 10
my_vect[which(my_vect > 20)]
[1] 30 30 26 35 37 23 36 31

Indicizzazione e Assegnazione

Indicizzare può essere utile anche per assegnare un valore ad un determinato elemento del vettore:

lettere
[1] "a" "b" "c" "d" "e" "f" "g"
lettere[1] = "z"
lettere
[1] "z" "b" "c" "d" "e" "f" "g"
lettere[9] = "i"
lettere
[1] "z" "b" "c" "d" "e" "f" "g" NA  "i"

Indicizzazione e Assegnazione

Sostituisco il valore NA con la lettera mancante

lettere
[1] "z" "b" "c" "d" "e" "f" "g" NA  "i"
is.na(lettere) # ci sono elementi di lettere = NA?
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
which(is.na(lettere)) # in che posizioni sono questi elementi?
[1] 8
# effettivamente se guardo nella posizione indicata
lettere[is.na(lettere)]
[1] NA
lettere[which(is.na(lettere))]  # equivalente
[1] NA
lettere[is.na(lettere)] = "h" # sostituisco NA con la lettera mancante
lettere
[1] "z" "b" "c" "d" "e" "f" "g" "h" "i"

Operazioni matematiche sui vettori

Operazioni matematiche sui vettori

Possiamo eseguire operazioni sui vettori, ed applicare la stessa operazione a tutti gli elementi del vettore (element-wise)

new_vect = rep(2:4, each = 2)
new_vect
[1] 2 2 3 3 4 4
# potete svolgere qualsiasi operazione
new_vect/2
[1] 1.0 1.0 1.5 1.5 2.0 2.0
log(new_vect)
[1] 0.6931472 0.6931472 1.0986123 1.0986123 1.3862944 1.3862944
exp(new_vect)
[1]  7.389056  7.389056 20.085537 20.085537 54.598150 54.598150

Summary Statistics

Le operazioni più comuni sono per esempio la media mean(), la deviazione standard sd(), la mediana median(), il valore massimo max() e minimo min() .

# creo un vettore campionando 1000 da una distribuzione normale 
new_vect = rnorm(n = 1000, mean = 1, sd = 4)
mean(new_vect)
[1] 0.8745842
sd(new_vect)
[1] 3.940867
median(new_vect)
[1] 0.8438001
summary(new_vect)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-10.7889  -1.6843   0.8438   0.8746   3.5015  12.8939 

Summary Statistics

Si può anche utilizzare la funzione describe del pacchetto psych:

psych::describe(new_vect)
   vars    n mean   sd median trimmed  mad    min   max range skew kurtosis
X1    1 1000 0.87 3.94   0.84    0.88 3.87 -10.79 12.89 23.68 0.01    -0.15
     se
X1 0.12

Valori NA

A volte (molto spesso) può capitare di avere dati mancanti

new_vect[1] = NA # Assegnamo NA al primo elemento del vettore

mean(new_vect) # è impossibile calcolare la media!
[1] NA
mean(new_vect, na.rm = TRUE) # soluzione!
[1] 0.8783685

Frequenze

Un’altra operazione comune che viene svolta sui vettori (e sulle altre strutture dati), è il conteggio delle frequeze

# riprendiamo il vettore creato all'inizio della lezione
char_vect
[1] "R"  "R"  "R"  "ok"
# attraverso la funzione table possiamo calcolare la frequenze
table(char_vect)
char_vect
ok  R 
 1  3 
# ricordatevi che R è case-sensitive!
char_vect[1] = "r"
char_vect
[1] "r"  "R"  "R"  "ok"
table(char_vect)
char_vect
ok  r  R 
 1  1  2 

Facciamo un po’ di pratica!


Aprite e tenete aperto questo link:

https://etherpad.wikimedia.org/p/arca-corsoR