Vettori in Linguaggio R

Uno dei punti di forza del linguaggio R è la capacità di poter lavorare con vettori.

Fondamentalmente, un vettore in R è una sequenza di valori dello stesso tipo. Questi valori possono essere numeri, stringhe, booleani, ecc.

La potenza di R nel lavorare con i vettori è data dal fatto che molte operazioni possono essere eseguite su tutti gli elementi del vettore in una sola volta, senza la necessità di scrivere cicli o iterazioni.

In questa lezione vediamo come creare vettori in R e come accedere ai suoi elementi.

Creazione di Vettori

In R, i vettori sono l'elemento di base per la gestione di elementi multipli. Da un punto di vista statistico si può pensare ad un vettore come una collezione di osservazioni o misure fatte di una stessa variabile.

Ad esempio, potremmo usare i vettori per memorizzare la temperatura di una stanza misurata nell'arco di una giornata. Supponiamo di aver misurato la temperatura dall'una di notte fino alle dieci di mattina, ottenendo una tabella del genere:

Ora Temperatura
1 20
2 19
3 19
4 18
5 18
6 19
7 20
8 20
9 21
10 22
Tabella 1: Temperatura della stanza misurata dall'una di notte alle dieci di mattina.

Per poter creare in R un vettore con le temperature di sopra è necessario usare la funzione c() (che sta per combine ossia combinare), che permette di creare un vettore concatenando i valori passati come argomento. I valori passati come argomento vanno separati da virgole, in questo modo:

> temperature <- c(20, 19, 19, 18, 18, 19, 20, 20, 21, 22)
> temperature
 [1] 20 19 19 18 18 19 20 20 21 22

Gli elementi di un vettore possono essere anche espressioni più complesse o oggetti creati in precedenza. Ad esempio:

> a <- 5
> b <- 3
> c <- 7
> vettore <- c(a, b, a + b, c, 5^2 * 3)
> vettore
[1]  5  3  8  7 75

Nell'esempio di sopra abbiamo creato un vettore vettore usando gli oggetti a, b, c e le espressioni a + b e 5^2 * 3.

Definizione

Creazione di Vettori in R

Per creare un vettore in R si usa la funzione c() a cui bisogna passare la lista di valori separati da virgole. La sintassi è la seguente:

nome_vettore <- c(valore1, valore2, ..., valoreN)

Sequenze

Spesso, in R, sorge la necessità di creare vettori composti da elementi numerici equispaziati ed in ordine crescente o decrescente.

Questa esigenza si manifesta, come vedremo, quando si vogliono creare grafici o quando si vogliono realizzare programmi che richiedono di lavorare con cicli.

Per questo motivo R mette a disposizione una sintassi ad hoc per creare sequenze di numeri. Vediamo un esempio.

Supponiamo di voler creare un vettore con i numeri interi da 20 a 30. In R è possibile farlo velocemente usando l'operatore di sequenza ::

> numeri <- 20:30
> numeri
 [1] 20 21 22 23 24 25 26 27 28 29 30

In questo caso l'espressione 20:30 va letta come "da 20 a 30 inclusi e spaziati di 1". Il risultato è un vettore che contiene i numeri da 20 a 30 inclusi.

La sequenza può contenere anche numeri reali. Ad esempio, per creare un vettore con i valori compresi tra 2.5 e 7.5 spaziati di 1 possiamo scrivere:

> numeri <- 2.5:7.5
> numeri
[1] 2.5 3.5 4.5 5.5 6.5 7.5
Definizione

Operatore di Sequenza in R

Per creare una sequenza di numeri equispaziati di 1 in R si usa l'operatore :. La sintassi è la seguente:

inizio:fine

dove inizio e fine sono i valori iniziale e finale della sequenza.

Nota

Incremento unitario e numeri reali

L'operatore : crea sequenze di numeri equispaziati di 1 partendo da un valore iniziale e terminando ad un valore finale. Tuttavia, non è detto che il valore finale sia raggiunto. Per comprendere meglio osserviamo l'esempio che segue:

> numeri <- 2.5:8
> numeri
[1] 2.5 3.5 4.5 5.5 6.5 7.5

Come si può vedere, la sequenza si ferma al numero 7.5. Infatti, nella generazione della sequenza, R ragiona in questo modo:

  1. Parte da 2.5 e lo inserisce nella sequenza;
  2. Aggiunge 1 a 2.5 e ottiene 3.5 che inserisce nella sequenza;
  3. Aggiunge 1 a 3.5 e ottiene 4.5 che inserisce nella sequenza;
  4. Continua in questo modo ed arriva al valore 7.5;
  5. A questo punto, però, aggiungendo 1 a 7.5 si otterrebbe 8.5 che è maggiore del valore finale della sequenza. Per questo motivo R si ferma a 7.5.
Consiglio

Sequenze decrescenti

L'operatore di sequenza può essere adoperato anche per creare sequenze decrescenti. Per far questo è sufficiente inserire un valore finale minore del valore iniziale. In tal caso R produrrà una sequenza a partire dal valore iniziale fino a quello finale usando come passo un incremento di -1.

Ad esempio, volendo generare una sequenza di numeri decrescente da 10 a 1 possiamo scrivere:

> numeri <- 10:1
> numeri
 [1] 10  9  8  7  6  5  4  3  2  1

La funzione seq

L'operatore di sequenza : ha il limite che non permette di specificare un incremento tra un numero e l'altro diverso da 1. Per ovviare a questo problema R mette a disposizione la funzione seq() che permette di creare sequenze con incrementi arbitrari.

Ad esempio, volendo creare un vettore di numeri che vanno da 1 a 10 con incremento di 0.5 possiamo scrivere:

> numeri <- seq(from = 1, to = 10, by = 0.5)
> numeri
 [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0
[16]  8.5  9.0  9.5 10.0

Come si può osservare dall'esempio, la funzione seq prende in ingresso 3 parametri:

  • from: il valore iniziale della sequenza;
  • to: il valore finale della sequenza;
  • by: l'incremento tra un numero e l'altro.

Anche in questo caso vale il ragionamento fatto per l'operatore sequenza :. Se il valore finale della sequenza non è raggiunto, R si ferma al valore più grande minore del valore finale. Ad esempio:

> numeri <- seq(from = 1, to = 12, by = 3)
> numeri
[1]  1  4  7 10

Come si può vedere, il valore finale della sequenza è 12 ma R si ferma a 10 in quanto il valore successivo sarebbe 13 che è maggiore del valore finale della sequenza.

Definizione

Funzione seq in R

Per creare una sequenza di numeri equispaziati con incremento arbitrario in R si usa la funzione seq(). La sintassi è la seguente:

seq(from = inizio, to = fine, by = incremento)

dove inizio e fine sono i valori iniziale e finale della sequenza e incremento è l'incremento tra un numero e l'altro.

Il parametro by è opzionale e, se non specificato, viene assunto di default uguale a 1.

Consiglio

Sequenze decrescenti con seq

Anche con la funzione seq è possibile creare sequenze decrescenti.

Nel caso in cui il parametro by non è specificato, basta inserire un valore finale minore di quello iniziale. Ad esempio

> numeri <- seq(from = 10, to = 1)
> numeri
 [1] 10  9  8  7  6  5  4  3  2  1

Viceversa, se il parametro by viene specificato bisogna assicurarsi che esso sia negativo. Ad esempio:

> numeri <- seq(from = 10, to = 1, by = -2)
> numeri
[1] 10  8  6  4  2

Spesso sorge la necessità di creare sequenze di numeri equispaziati dove, tuttavia, vogliamo specificare la cardinalità piuttosto che il passo di incremento. Ad esempio, potremmo essere interessati a creare una sequenza compresa tra 10 e 20 composta da 30 elementi.

Un primo modo per fare questo è quello di calcolare l'incremento tra un numero e l'altro e poi usare la funzione seq per creare la sequenza. Ad esempio, potremmo inserire i seguenti comandi:

> inizio <- 10
> fine <- 20
> incremento <- (fine - inizio) / 29
> numeri <- seq(from = inizio, to = fine, by = incremento)
> numeri
 [1] 10.00000 10.34483 10.68966 11.03448 11.37931 11.72414 12.06897 12.41379
 [9] 12.75862 13.10345 13.44828 13.79310 14.13793 14.48276 14.82759 15.17241
[17] 15.51724 15.86207 16.20690 16.55172 16.89655 17.24138 17.58621 17.93103
[25] 18.27586 18.62069 18.96552 19.31034 19.65517 20.00000

Da notare che per calcolare l'incremento abbiamo diviso per 29 e non per 30. Questo perché il valore iniziale deve essere incluso nella sequenza, per cui dobbiamo considerare un elemento in meno nell'incremento.

Come si può vedere, questo procedimento è abbastanza macchinoso e può portare a errori. Per ovviare a questo problema, la funzione seq permette di specificare il numero di elementi piuttosto che l'incremento. Per far questo dobbiamo usare il parametro length.out. Così facendo, i comandi di sopra possono essere sostituiti da un'unica riga:

> numeri <- seq(from = 10, to = 20, length.out = 30)
> numeri
 [1] 10.00000 10.34483 10.68966 11.03448 11.37931 11.72414 12.06897 12.41379
 [9] 12.75862 13.10345 13.44828 13.79310 14.13793 14.48276 14.82759 15.17241
[17] 15.51724 15.86207 16.20690 16.55172 16.89655 17.24138 17.58621 17.93103
[25] 18.27586 18.62069 18.96552 19.31034 19.65517 20.00000
Definizione

Generazione di sequenze con numero di elementi fissato

Per creare una sequenza di numeri equispaziati con un numero di elementi fissato in R si usa la funzione seq() specificando il parametro length.out. La sintassi è la seguente:

seq(from = inizio, to = fine, length.out = numero_elementi)

dove inizio e fine sono i valori iniziale e finale della sequenza e numero_elementi è il numero di elementi che la sequenza dovrà contenere.

Ripetizioni

Un'altra operazione molto comune è quella di creare vettori che contengono lo stesso valore oppure gli stessi valori ripetuti più volte. Per fare questo R mette a disposizione la funzione rep().

Ad esempio, per creare un vettore con 10 elementi tutti uguali a 5 possiamo scrivere:

> numeri <- rep(5, times = 10)
> numeri
 [1] 5 5 5 5 5 5 5 5 5 5

In questo caso, la funzione rep prende in ingresso due parametri:

  • x: il valore da ripetere;
  • times: il numero di volte che il valore x deve essere ripetuto.

Il parametro x non necessariamente deve essere un valore numerico. Possiamo utilizzare anche un altro vettore. in tal caso rep ripeterà tutto il vettore x per il numero di volte specificato. Ad esempio:

> numeri <- rep(c(1, 2, 3), times = 3)
> numeri
[1] 1 2 3 1 2 3 1 2 3
> numeri_2 <- rep(2:4, times = 2)
> numeri_2
[1] 2 3 4 2 3 4

In questo caso, rep ha ripetuto il vettore c(1, 2, 3) per 3 volte e il vettore 2:4 per 2 volte.

Esiste, inoltre, anche il parametro each che può essere specificato per la funzione rep. Questo parametro specifica il numero di volte che ogni elemento del vettore x deve essere ripetuto. Ad esempio:

> numeri <- rep(c(1, 2, 3), each = 3)
> numeri
[1] 1 1 1 2 2 2 3 3 3

La differenza rispetto a prima è che, invece di ripetere tutto il vettore in blocco per il numero di volte specificato, rep ha ripetuto singolarmente ogni elemento del vettore per il numero di volte specificato. Quindi ha ripetuto per 3 volte prima il valore 1, poi il valore 2 e infine il valore 3.

I parametri times e each possono essere usati insieme. In tal caso, rep applicherà prima il parametro each e poi il parametro times. Ad esempio:

> numeri <- rep(c(1, 2, 3), each = 2, times = 2)
> numeri
[1] 1 1 2 2 3 3 1 1 2 2 3 3
Definizione

Funzione rep in R

Per creare un vettore con valori ripetuti in R si usa la funzione rep(). La sintassi è la seguente:

rep(x, times = n, each = m)

dove x è l'oggetto da ripetere, times è il numero di volte che x deve essere ripetuto e each è il numero di volte che ogni elemento di x deve essere ripetuto.

Sia il parametro each che times sono opzionali. Nel caso in cui non vengano specificati, il loro valore è automaticamente assunto ad 1.

Combinazione di Vettori

Le funzioni viste sopra, c, rep e seq, permettono di creare vettori in diversi modi. Queste funzioni possono essere combinate tra di loro per creare vettori più complessi.

Ad esempio, supponiamo di voler creare un vettore del genere:

\begin{align*} 5, 9, 10, 1, 2, 3, 4, 1, 2, 3, 4, 20, 21, 22, 23 \end{align*}

Per fare questo possiamo usare la funzione c per concatenare i vettori 5, 9, 10, 1:4, 20:23. In questo modo:

> numeri <- c(5, 9, 10, rep(1:4, times = 2), 20:23)
> numeri
 [1]  5  9 10  1  2  3  4  1  2  3  4 20 21 22 23

In questo caso abbiamo usato la funzione rep per ripetere il vettore 1:4 due volte e poi abbiamo concatenato tutti i vettori usando la funzione c.

Consiglio

Combinazione di Vettori

In R è possibile combinare le funzioni c, seq, rep e l'operatore di sequenza : per costruire vettori più complessi.

Lunghezza di un vettore

Ora che abbiamo visto come creare vettori, l'ultimo argomento di questa lezione riguarda la lunghezza di un vettore. In R è possibile ottenere la lunghezza di un vettore usando la funzione length().

Ad esempio, per ottenere la lunghezza del vettore numeri creato sopra possiamo scrivere:

> length(numeri)
[1] 15
Definizione

Lunghezza di un Vettore in R: funzione length

Per ottenere la lunghezza di un vettore in R si usa la funzione length(). La sintassi è la seguente:

length(vettore)

dove vettore è il vettore di cui si vuole conoscere la lunghezza.

In Sintesi

Ricapitolando, in questa lezione abbiamo visto che:

  • In R è possibile creare vettori usando la funzione c() e l'operatore di sequenza :;
  • La funzione seq() permette di creare sequenze di numeri equispaziati con incremento arbitrario;
  • La funzione rep() permette di creare vettori con valori ripetuti;
  • Le funzioni c, seq e rep possono essere combinate tra di loro per creare vettori più complessi;
  • La lunghezza di un vettore si può ottenere usando la funzione length().

Nella prossima lezione vedremo come accedere agli elementi di un vettore in R.