List of 4
$ : chr "ciao!"
$ : int [1:3] 1 2 3
$ : logi [1:2] TRUE FALSE
$ :List of 3
..$ : chr "ciao!"
..$ : int [1:3] 1 2 3
..$ : logi [1:2] TRUE FALSE
vettori
fattori
liste
matrici
array
dataframe
Le liste sono strutture flessibili che possono contenere oggetti di tipo differente e di differenti dimensioni (ogni elemento può essere a sua volta una lista)
La lista pur essendo unidimensionale, si sviluppa in profondità
Primo Livello: lista
Secondo Livello: vettore numerico
Terzo Livello: numero intero
E’ possibile assegnare dei nomi agli elementi della lista…
ed accerdervi chiamandoli per “nome” attraverso l’operatore $
Come per i vettori anche le liste hanno una lunghezza (lenght()
) ed eventualmente dei nomi (names()
). Il comando str()
(struttura) è molto utile per le liste perchè fornisce una visione sulla struttura:
La differenza tra le parentesi quadre riguarda il fatto se vogliamo fare un subset della lista ottenendo un’altra lista oppure se vogliamo accedere direttamente all’elemento interno:
Se vogliamo selezionare più elementi (quindi fare un vero e proprio subset della lista) dobbiamo sempre usare le parentesi quadre singole:
Le liste hanno una struttura unidimensionale ma che si può sviluppare in profondità. Per selezionare elementi nested si possono concatenare più parentesi:
Sono flessibili, permettono di conservare/organizzare dati/informazioni complesse e varie. Per esempio la funzione lm()
fornisce in output una lista contentente varie informazioni e risultati sul modello testato.
N = 30; b0 = 0; b1 = 0.3; sigma = 1
x = rnorm(N, 0, 1); y = b0 + b1*x + rnorm(n = N, mean = 0, sd = sigma)
mod = lm(y ~ x)
str(mod)
List of 12
$ coefficients : Named num [1:2] -0.114 0.357
..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
$ residuals : Named num [1:30] -1.0432 0.0448 -1.3035 0.5677 0.23 ...
..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
$ effects : Named num [1:30] 0.436 2.052 -1.153 0.647 0.398 ...
..- attr(*, "names")= chr [1:30] "(Intercept)" "x" "" "" ...
$ rank : int 2
$ fitted.values: Named num [1:30] -0.2672 -0.6753 -0.2421 -1.1497 -0.0187 ...
..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
$ assign : int [1:2] 0 1
$ qr :List of 5
..$ qr : num [1:30, 1:2] -5.477 0.183 0.183 0.183 0.183 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:30] "1" "2" "3" "4" ...
.. .. ..$ : chr [1:2] "(Intercept)" "x"
.. ..- attr(*, "assign")= int [1:2] 0 1
..$ qraux: num [1:2] 1.18 1.28
..$ pivot: int [1:2] 1 2
..$ tol : num 1e-07
..$ rank : int 2
..- attr(*, "class")= chr "qr"
$ df.residual : int 28
$ xlevels : Named list()
$ call : language lm(formula = y ~ x)
$ terms :Classes 'terms', 'formula' language y ~ x
.. ..- attr(*, "variables")= language list(y, x)
.. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr [1:2] "y" "x"
.. .. .. ..$ : chr "x"
.. ..- attr(*, "term.labels")= chr "x"
.. ..- attr(*, "order")= int 1
.. ..- attr(*, "intercept")= int 1
.. ..- attr(*, "response")= int 1
.. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. ..- attr(*, "predvars")= language list(y, x)
.. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. ..- attr(*, "names")= chr [1:2] "y" "x"
$ model :'data.frame': 30 obs. of 2 variables:
..$ y: num [1:30] -1.31 -0.631 -1.546 -0.582 0.211 ...
..$ x: num [1:30] -0.43 -1.574 -0.36 -2.904 0.266 ...
..- attr(*, "terms")=Classes 'terms', 'formula' language y ~ x
.. .. ..- attr(*, "variables")= language list(y, x)
.. .. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. .. ..- attr(*, "dimnames")=List of 2
.. .. .. .. ..$ : chr [1:2] "y" "x"
.. .. .. .. ..$ : chr "x"
.. .. ..- attr(*, "term.labels")= chr "x"
.. .. ..- attr(*, "order")= int 1
.. .. ..- attr(*, "intercept")= int 1
.. .. ..- attr(*, "response")= int 1
.. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. .. ..- attr(*, "predvars")= language list(y, x)
.. .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. .. ..- attr(*, "names")= chr [1:2] "y" "x"
- attr(*, "class")= chr "lm"
vettori
fattori
liste
matrici
array
dataframe
Le matrici sono una struttura dati bidimensionale (caratterizzate da 2 dimensioni dim()
) dove il numero di righe rappresenta la dimensione 1 e il numero di colonne la dimensione 2.
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
Possono contenere una sola tipologia di dati
Essendo bidimensionali, abbiamo bisogno di due indici di posizione (righe e colonne) per identificare un elemento
Possono essere viste come un insieme di singoli vettori
Il numero di righe e colonne non deve essere lo stesso necessariamente (matrice quadrata) ma il numero di righe deve essere compatibile con il vettore data:
Cosa fa R di default?
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 2 1 2
[3,] 1 2 1
warnings
: la funzione ci informa di qualcosa di potenzialmente problematico, ma (circa!!) tutto liscio
Per identificare uno o più elementi nella matrice abbiamo bisogno di indici/e di riga e/o colonna separati da virgola, sempre con le parentesi quadre: matrice[riga, colonna]
E’ possibile anche selezionare un’intera riga o colonna
Come per i vettori, anche in questo caso possiamo applicare l’indicizzazione logica:
I vettori si creano attraverso la funzione c()
e possono essere concatenati tra loro sempre attraverso la stessa funzione:
Similarmente, le matrici possono essere unite tra loro attraverso i comandi cbind()
e rowbind()
:
Come per i vettori, anche alle matrici si possono applicare operazioni matematiche:
vettori
fattori
liste
matrici
array
dataframe
Gli array sono degli oggetti n-dimensionali (es., se la matrice è un quadrato un array è un cubo). Valgono le stesse proprietà della matrice scalate alle n dimensioni
L’indicizzazione avviene allo stesso modo delle matrici aggiungendo una dimensione
Aprite e tenete aperto questo link:
https://etherpad.wikimedia.org/p/arca-corsoR