Tracce
/
R
R
/
Programma
/
Vettori
Ve

Vettori in R

1 esercizio

Informazioni su Vettori

Un vector (tecnicamente un atomic vector) in R è una raccolta di valori dello stesso type: comunemente integer, numeric, character, logical; raramente complex o raw. Sono memorizzati in modo contiguo in memoria, in modo simile a un array C.

Se riceve input misti, R li convertirà silenziosamente tutti a un tipo comune, di solito character, il che può portare a risultati inattesi.

v <- c(2, 5.4, "txt")
v
#> [1] "2"   "5.4" "txt"
typeof(v)
#> [1] "character"

Creare vettori

Se hai già tutti i valori, usa c() (abbreviazione di «concatenate»):

x <- 10
v <- c(4, 7, x)

La funzione c() è molto flessibile e gli input possono includere altri vettori e intervalli. c() accetta qualsiasi numero e varietà di input e li appiattisce in un unico vettore.

Se il vettore parte piccolo e cresce molto durante l'esecuzione (per esempio, aggiungendo valori in un ciclo), può essere molto più veloce preallocare un vettore lungo che potrà essere riempito con i dati reali in seguito:

v <- vector(length = 100) 

Questo riduce al minimo la necessità di copiare l'oggetto: un'operazione lenta e avida di memoria per i vettori lunghi.

Intervalli, sequenze, ripetizioni

Per un intervallo di valori consecutivi (crescenti o decrescenti) puoi usare la notazione :

v <- 1:5 # equivalent to c(1, 2, 3, 4, 5)
w <- 10:7 # c(10, 9, 8, 7)

In R, gli intervalli non sono un tipo separato: sono solo un modo abbreviato per costruire un vettore.

La funzione seq() offre un controllo più preciso:

# specify step size
seq(2, 11, by = 3) # c(2, 5, 8, 11)

# specify number of values, evenly-spaced
seq(2.5, 4, length.out = 5) # c(2.500, 2.875, 3.250, 3.625, 4.000) 

La funzione rep() permette di creare facilmente schemi ripetuti:

count <- 3
rep(7, count)
#> [1] 7 7 7

rep(1:3, count)
#> [1] 1 2 3 1 2 3 1 2 3

rep(1:3, each = 2) # the "each" keyword is required in this case
#> [1] 1 1 2 2 3 3

Alcuni intervalli sono predefiniti come costanti integrate:

letters  # LETTERS is the UPPERCASE equivalent
#> [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"

month.name
#> [1] "January"   "February"  "March"     "April"     "May"       "June"      "July"      "August"   
#> [9] "September" "October"   "November"  "December" 

month.abb
#> [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

Aritmetica

Le operazioni vengono applicate automaticamente elemento per elemento lungo il vettore. I cicli, le comprensioni di liste e le ricorsioni comuni in altri linguaggi non sono necessari e (per motivi di prestazioni) andrebbero evitati se possibile.

2 + 1:3     # c(3, 4, 5)
2 * 1:3     # c(2, 4, 6)
12 / 1:3    # c(12  6  4)
2 ^ (1:3)   # c(2, 4, 8) : exponentiation, operator precedence order here needs ()

Funzionano anche le coppie di vettori, con gli elementi trattati a coppie:

v <- 1:3
w <- 5:7

v + w
#> [1]  6  8 10

v * w
#> [1]  5 12 21

v ^ w
#> [1]    1   64 2187

Questo è più potente di quanto sembri a prima vista, e ci sarà altro da esplorare nei concetti successivi.

Accedere agli elementi di un vettore

Come in molti linguaggi, possiamo usare l'indice tra parentesi quadre:

v <- 4:7
v[2]
#> [1] 5
v[2:4]
#> [1] 5 6 7

Ma attenzione: R usa per impostazione predefinita l'indicizzazione a base 1. Questo è comune nei linguaggi scientifici (Fortran, Matlab, Julia), ma differisce dall'indicizzazione a base zero di C e dei suoi molti successori.

Gli intervalli possono essere usati, come nell'esempio sopra, ma anche nella flessibilissima funzione c():

v <- c(4, 7, 10)
w <- c(2, v[2:3], 11) # c(2, 7, 10, 11)

I vectors (come la maggior parte delle cose in R) possono essere trattati come mutabili, usando una sintassi flessibile simile per scrivere su singoli elementi o su più elementi:

v <- 1:10
v[2] <- 42
v[4:6] <- c(11, 12, 13)
v
#> [1]  1 42  3 11 12 13  7  8  9 10

Indici negativi

I programmatori che conoscono altri linguaggi potrebbero pensare che v[-1] sia un modo per accedere all'ultimo elemento di un vettore. Sbagliato! Per farlo, usa tail().

v <- c(2, 4, 6) # defaults to last 6 entries
tail(v)
#> [1] 2 4 6
tail(v, n=1) # just the last entry
#> [1] 6

Gli indici negativi sono in realtà un modo per rimuovere un elemento:

v <- c(2, 4, 6)
v[-2]
#> [1] 2 6  # second element gone

Questo restituisce una copia più corta del vettore. v stesso rimane invariato.

Condizionali sui vettori

Applicare dei confronti a un vettore restituirà un vettore di valori booleani della stessa lunghezza. Questo può essere molto comodo all'interno di funzioni come all() e any():

v <- c(4, 7, 10)
v >= 6
#> [1] FALSE  TRUE  TRUE
all(v > 6)
#> [1] FALSE    # not all elements match this condition
any(v > 6)
#> [1] TRUE     # at least one element matches

Per espressioni logiche più complicate, è importante usare gli operatori & e |, che funzionano sui vettori. I doppi caratteri && e || sono pensati solo per confrontare singoli valori, come discusso nel [concetto Booleani][concept-boolean].

v <- c(4, 7, 10)
v %% 2 == 0 & v > 5
#> [1] FALSE FALSE  TRUE

I vettori sono ovunque in R

Torneremo su questo argomento nei prossimi capitoli. Per ora, nota solo il formato dell'output nella console:

1:20
#> [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
#> [18] 18 19 20

Le righe iniziano con numeri tra [ ] per indicare l'indice del primo elemento (utile per i vettori lunghi che vanno a capo su più righe). Ma perché i singoli valori sono preceduti da [1]?

Note

Non esistono valori davvero scalari in R!

Quello che sembra un singolo numero o una singola lettera è in realtà un vettore di lunghezza 1.

Ne abbiamo già visto accenni nei concetti Basi e Booleani, con i tipi numerici e logici.

Una nota sulla notazione

I vettori descritti sopra sono più formalmente noti come atomic vectors. Questo perché possono contenere solo valori semplici e indivisibili (da cui «atomic», atomici) come numeric, character, boolean. Strutture più complesse possono formare i recursive vectors, che verranno introdotti quando parleremo delle lists.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Vettori