R è un linguaggio tipizzato dinamicamente: il tipo di una variabile viene determinato automaticamente al momento dell’assegnazione. I principali tipi scalari sono:
| Tipo | Esempio | str() restituisce |
|---|---|---|
numeric |
3.14, 10 |
num |
integer |
2L, 10L |
int |
character |
"hello" |
chr |
logical |
TRUE, FALSE |
logi |
R è orientato agli oggetti: possiamo creare entità denominate
oggetti. Come operatori di assegnamento possiamo usare
<- o =. Gli oggetti creati vengono raccolti
nell’environment.
Le variabili numeriche in R sono di default in virgola mobile
(double). La funzione str() mostra il tipo e
la struttura di un oggetto.
a <- 10
b <- 3 / 10 # b vale 0.3
c <- a * (a + b) / (a - b) # operazione aritmetica
str(a) # Visualizziamo tipo e struttura oggetto#> num 10
#> num 0.3
#> [1] 10.61856
Gli oggetti b e c sono stati costruiti
utilizzando operatori aritmetici. I principali operatori aritmetici
possono essere visualizzati mediante la funzione help(),
utile a capire come utilizzare una funzione e cosa fa.
Qualche nota sul nome degli oggetti:
. e
_#> [1] 1
Le stringhe si delimitano con virgolette doppie o singole.
Attenzione: "1" + "2" produce un errore,
perché + non concatena stringhe.
#> chr "Ciao"
💡 Per concatenare stringhe si usa
paste()opaste0().
#> [1] "Ciao mondo"
#> [1] "Ciaomondo"
#> [1] "Ciao-mondo"
#> [1] "Ciaomondo.txt"
Per forzare un valore intero si usa il suffisso
L. Senza L, R crea un
numeric (double) anche se il valore sembra intero.
#> num 2
#> int 2
I valori TRUE e FALSE (abbreviabili in
T e F) possono essere usati in operazioni
aritmetiche: TRUE = 1, FALSE = 0.
#> [1] 1
#> [1] 2
#> logi TRUE
is.* e as.*)Le funzioni is.* verificano il tipo
#> [1] FALSE
#> [1] TRUE
#> [1] TRUE
#> [1] TRUE
#> [1] TRUE
#> [1] TRUE
💡 Le funzioni
as.*()convertono da un tipo all’altro.
#> [1] 3.14
#> [1] 3
#> [1] "100"
#> [1] 0
#> [1] FALSE
#> [1] TRUE
#> [1] NA
⚠️ Quando la conversione non è possibile, R restituisce
NAe unWarning.
Esercizio 1
Prova a prevedere il risultato prima di eseguire il codice, poi verifica:
#> [1] 3
#> [1] NA
#> [1] TRUE
#> [1] "3.14"
Un vettore è la struttura di base di R. Contiene elementi dello stesso tipo
db_v <- c(10, 15, 6.4, 3, 18) # numeric
int_v <- c(1L, 6L, 10L) # integer
log_v <- c(TRUE, FALSE, T, F) # logical
ch_v <- c("A", "B", "C") # character
str(db_v)#> num [1:5] 10 15 6.4 3 18
#> int [1:3] 1 6 10
#> logi [1:4] TRUE FALSE TRUE FALSE
#> chr [1:3] "A" "B" "C"
⚠️ Se si mescolano tipi diversi, R applica la coercizione automatica:
\[\text{logical} \rightarrow \text{integer} \rightarrow \text{double} \rightarrow \text{character}\]
#> int [1:2] 1 1
#> num [1:3] 1 1 2
#> chr [1:4] "TRUE" "1" "2" "a"
R offre diversi modi per generare sequenze numeriche:
💡 Operatore
:, il più veloce
#> [1] 1 2 3 4 5 6 7 8 9 10
💡 Funzione
seq(), più flessibile
#> [1] 1 2 3 4 5 6 7 8 9 10
#> [1] 1 4 7 10
#> [1] 1.00 3.25 5.50 7.75 10.00
💡 Funzione
rep(), per ripetizioni
#> [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
#> [1] "a" "a" "a" "a" "a" "b" "b" "b" "b" "b"
Esercizio 2
Prova a generare un vettore di 3 elementi contenenti i nomi dei files: “file1.txt” “file2.txt” “file3.txt”.💡 Suggerimento: usa le funzioni di concatemento stringhe e di generamento di sequenze numeriche
```
#> [1] "file1.txt" "file2.txt" "file3.txt"
⚠️ In R gli indici partono da 1 (non da 0 come in Python o C). Possiamo selezionare un singolo o molteplici elementi di un vettore
#> [1] 2 2 2 4 5 1 1 1 1 1 11 12 13 14 15
#> [1] 1
#> [1] 2 2 4
#> [1] 2 5
#> [1] 1 2 4 16 32
#> [1] 1 2 4 8 16 32
#> [1] 1 2 4 16 32
Possiamo selezionare gli elementi di un vettore mediante usando
operatori relazionali (>, >=,
<, <=, ==, !=)
e condizioni logiche (!, &,
|)
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#> [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
#> [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
#> [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE
#> [1] 0 1 2 3 4 7
#> [1] 3 4 5 6
Le operazioni in R sono vettorializzate: si applicano elemento per elemento.
#> [1] 2 4 6 8 10 12 14 16 18 20
#> [1] 1 4 9 16 25 36 49 64 81 100
Se i vettori hanno lunghezza diversa, il più corto
viene riciclato (recycling). Se le lunghezze non sono
esattamente multiple, R lancia un Warning.
#> [1] 10 20 10 20 10 20 10 20
#> Warning in x * z: la lunghezza più lunga dell'oggetto non è un multiplo della
#> lunghezza più corta dell'oggetto
#> [1] 10 20 30 10 20 30 10 20
Esercizio 3
Definisciy <- c(8, 3, 5, 7, 6, 6, 8, 9, 2).
Tutti gli elementi sono minori di 5? Crea un vettorezcon i soli elementi minori di 5.
#> [1] FALSE
#> [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#> [1] 3 2
Esercizio 4
Fornisci un esempio di vettore in cui valori logici vengono convertiti in 0/1 tramite un operatore aritmetico.
#> [1] 1 1 0
#> [1] 1 1 0
Esercizio 5
Crea un vettore logico di lunghezza 3 e moltiplicalo perrunif(3). Cosa succede?
#> [1] 0.005836157 0.334926841 0.000000000
all() e any()L’operatore logico all() verifica se tutte le condizioni
in un vettore sono vere, mentre l’operatore any() verifica
se almeno una condizione è vera
#> [1] FALSE
#> [1] FALSE
#> [1] TRUE
#> [1] TRUE
Qui una rassegna di funzioni statistiche utili
#> [1] 20
#> [1] 250
#> [1] 12.5
#> [1] 22
#> [1] 3
#> [1] 3 22
#> [1] 5.620004e+20
💡 Riordinare un vettore mediante
sort()
#> [1] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2
#> [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#> [1] 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
#> [1] 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Si possono dare nomi agli alementi di un oggetto * durante la
creazione (Metodo 1) * utilizzando la funzione names()
#> a b c
#> 1 2 3
#> a1 b1 c1
#> 1 2 3
Si può quindi accedere per nome
#> a1
#> 1
#> [1] "b1"
Esercizio 6 Usa
set.seed(123)e creax <- sample(10) < 4. Cosa fawhich(x)?
Esercizio 7 Definisci
y <- c(9, 2, 3, 9, 4, 10, 4, 11). Calcola la somma dei tre valori più grandi.
y <- c(9, 2, 3, 9, 4, 10, 4, 11)
# Metodo 1: sort decrescente
sum(sort(y, decreasing = TRUE)[1:3]) # → 30#> [1] 30
#> [1] 30
Esercizio 8 Crea
x <- 1:4. Cosa restituiscex[c(TRUE, TRUE, NA, FALSE)]? Perché?
#> [1] 1 2 NA
Una matrice è una struttura bidimensionale che
generalizza il vettore: contiene elementi dello stesso
tipo, organizzati in righe e colonne. Si crea con la funzione
matrix().
#> [,1] [,2]
#> [1,] 2 7
#> [2,] 3 11
#> [3,] 5 13
#> [,1] [,2] [,3]
#> [1,] 2 5 11
#> [2,] 3 7 13
⚠️ Per default R riempie la matrice per colonna (
byrow = FALSE). Per riempire per riga si usabyrow = TRUE.
#> [,1] [,2] [,3]
#> [1,] 2 3 5
#> [2,] 7 11 13
Le funzioni nrow(), ncol() e
dim() restituiscono rispettivamente il numero di righe, di
colonne e le due dimensioni come vettore.
#> [1] 2
#> [1] 3
#> [1] 2 3
#> [1] 2
Con rownames() e colnames() si assegnano
nomi alle righe e alle colonne:
#> a b c
#> A 2 3 5
#> B 7 11 13
La selezione per matrici segue la notazione
[riga, colonna], analoga ai vettori ma su due dimensioni.
Lasciando vuota una delle due dimensioni si seleziona l’intera riga o
colonna.
#> [1] 7
#> [1] 11
#> a b c
#> 7 11 13
#> a b c
#> 7 11 13
#> A B
#> 5 13
#> A B
#> 5 13
#> a b
#> A 2 3
#> B 7 11
💡 Come per i vettori, è possibile usare indici per selezionare righe o colonne.
#> [,1] [,2] [,3] [,4]
#> [1,] 1 5 9 13
#> [2,] 2 6 10 14
#> [3,] 3 7 11 15
#> [4,] 4 8 12 16
#> [,1] [,2] [,3]
#> [1,] 5 9 13
#> [2,] 8 12 16
💡 Come per i vettori, è possibile usare indici negativi per escludere righe o colonne.
#> [,1] [,2] [,3]
#> [1,] 7 11 15
#> [2,] 8 12 16
R offre funzioni native per le operazioni di algebra lineare, fondamentali nell’analisi statistica.
#> [1] 2.4 6.0 0.8 20.0
| Operazione | Funzione / Operatore |
|---|---|
| Prodotto scalare | crossprod(x, y) o x %*% y |
| Prodotto riga×colonna | a %*% b |
| \(A^\top B\) | crossprod(a, b) |
| \(A B^\top\) | tcrossprod(a, b) |
#> [,1]
#> [1,] 63
#> [,1]
#> [1,] 63
#> [1] TRUE
a <- matrix(c(1, 2, 3, 4), ncol = 2, byrow = TRUE)
b <- matrix(c(1, -1, 0, 1), ncol = 2, byrow = TRUE)
a#> [,1] [,2]
#> [1,] 1 2
#> [2,] 3 4
#> [,1] [,2]
#> [1,] 1 -1
#> [2,] 0 1
#> [,1] [,2]
#> [1,] 1 -2
#> [2,] 0 4
#> [,1] [,2]
#> [1,] 1 1
#> [2,] 3 1
#> [,1] [,2]
#> [1,] 1 2
#> [2,] 2 2
#> [,1] [,2]
#> [1,] -1 2
#> [2,] -1 4
💡
crossprod()è più efficiente dit(X) %*% Xper matrici grandi, perché evita il calcolo esplicito della trasposizione.
#> [,1] [,2]
#> [1,] 1 -1
#> [2,] 1 1
#> [,1] [,2]
#> [1,] 0.5 0.5
#> [2,] -0.5 0.5
#> [1] 3 1
#> [1] 1 1
#> [,1] [,2]
#> [1,] 2 0
#> [2,] 0 4
#> [,1] [,2] [,3]
#> [1,] 1 0 0
#> [2,] 0 1 0
#> [3,] 0 0 1
#> [1] 2
Esercizio 10
DefinisciA <- matrix(c(2, 1, 5, 3), nrow = 2, byrow = TRUE)eb <- c(1, 2).
Calcola l’inversa diAe verifica cheA %*% solve(A)restituisca la matrice identità.
Poi risolvi il sistema \(Ax = b\).
#> [,1] [,2]
#> [1,] 3 -1
#> [2,] -5 2
#> [,1] [,2]
#> [1,] 1 2.220446e-16
#> [2,] 0 1.000000e+00
#> [1] 1 -1
Un array è la generalizzazione della matrice a più
di due dimensioni. Le matrici sono array con
dim = c(righe, colonne).
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1 6
#> [2,] 2 7
#> [3,] 3 8
#> [4,] 4 9
#> [5,] 5 10
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 11 16
#> [2,] 12 17
#> [3,] 13 18
#> [4,] 14 19
#> [5,] 15 20
#> [1] 5 2 2
La selezione è analoga alle matrici, ma con tre (o più) indici:
#> [1] 8
#> [,1] [,2]
#> [1,] 6 16
#> [2,] 7 17
#> [3,] 8 18
#> [4,] 9 19
#> [5,] 10 20
#> [,1] [,2]
#> [1,] 2 7
#> [2,] 3 8
#> [3,] 4 9
#> [4,] 5 10
Una matrice è un vettore con un attributo dim. È
importante capire quando R “degrada” una struttura a vettore durante il
subsetting:
#> int [1:3] 2 3 4
#> [,1] [,2] [,3]
#> [1,] 2 3 4
#> int [1, 1:3] 2 3 4
#> [,1]
#> [1,] 2
#> [2,] 3
#> [3,] 4
#> int [1:3, 1] 2 3 4
#> [1] TRUE
#> [1] TRUE
#> int [1:2] 3 4
#> [1] TRUE
#> [1] FALSE
#> NULL
#> [,1]
#> [1,] 3
#> [2,] 4
Una lista è una collezione di oggetti che possono essere di tipo diverso (vettori, matrici, altre liste…). È la struttura più flessibile di R.
x1 <- 1:3
x2 <- c("A", "B", "C", "D", "E")
x3 <- matrix(1:12, nrow = 3)
mylist <- list(x1, x2, x3)
str(mylist)#> List of 3
#> $ : int [1:3] 1 2 3
#> $ : chr [1:5] "A" "B" "C" "D" ...
#> $ : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
⚠️ In una lista si usano doppie parentesi quadre
[[i]]per estrarre un elemento; le parentesi singole[i]restituiscono una sotto-lista.
#> [1] 1 2 3
#> [1] "C"
#> [,1] [,2] [,3] [,4]
#> [1,] 1 4 7 10
#> [2,] 2 5 8 11
#> [3,] 3 6 9 12
#> [1] 1
#> [1] 2
Si possono assegnare nomi ai componenti di una lista durante la
creazione oppure in seguito. L’accesso per nome avviene con
$ o [["nome"]].
#> [1] 1 2 3
#> [1] "C"
#> [1] 1 2 3
Esercizio 11
Crea una lista con tre componenti: un vettore numerico, una stringa e una matrice 2×2.
Assegna nomi ai componenti e accedi a ciascuno di essi in almeno due modi diversi.
mylist3 <- list(
numeri = c(1.5, 2.5, 3.5),
testo = "ciao",
matrice = matrix(1:4, nrow = 2)
)
mylist3$numeri#> [1] 1.5 2.5 3.5
#> [1] 1.5 2.5 3.5
#> [1] "ciao"
#> [1] "ciao"
#> [1] 3
#> [1] 3
#> List of 4
#> $ : int [1:3] 1 2 3
#> $ : NULL
#> $ : NULL
#> $ : chr "questo è il quarto elemento della lista x"
#> [1] TRUE
#> List of 6
#> $ : int [1:3] 1 2 3
#> $ : chr [1:5] "A" "B" "C" "D" ...
#> $ : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
#> $ comp1: int [1:3] 1 2 3
#> $ comp2: chr [1:5] "A" "B" "C" "D" ...
#> $ comp3: int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
Anche dopo l’unione si possono assegnare o modificare i nomi:
#> [1] "comp1" "comp2" "comp3"
#> [1] 1 2 3
#> [1] 1 2 3
#> [1] 1 2 3
R prevede alcuni valori speciali utili nella pratica:
| Valore | Significato | Esempio |
|---|---|---|
NA |
dato mancante (Not Available) | as.numeric("a") → NA |
NaN |
non è un numero (Not a Number) | 0 / 0 |
Inf |
infinito | 1 / 0 |
-Inf |
meno infinito | -1 / 0 |
NULL |
oggetto vuoto / assenza di valore | list() |
#> [1] NaN
#> [1] Inf
#> [1] -Inf
#> [1] NaN
#> [1] NA
Un fattore (factor) è un vettore per
variabili categoriali. Ogni categoria distinta è un
livello (level). I fattori sono efficienti
in memoria e fondamentali per la modellazione statistica.
country <- c("Italia", "Germania",
"Francia", "Germania",
"Germania", "Germania",
"Francia",
"Italia", "Italia",
"Francia")
str(country) # character, non ancora un factor#> chr [1:10] "Italia" "Germania" "Francia" "Germania" "Germania" "Germania" ...
#> Factor w/ 3 levels "Francia","Germania",..: 3 2 1 2 2 2 1 3 3 1
#> [1] TRUE
#> [1] "Francia" "Germania" "Italia"
💡
factor()eas.factor()producono lo stesso risultato, mafactor()è più flessibile perché permette di specificare livelli e ordine.
Il comando cbind applicato a vettori e/o matrici (purchè aventi egual numero di righe) permette di affiancare gli oggetti in colonna.
#> country countryf
#> [1,] "Italia" "3"
#> [2,] "Germania" "2"
#> [3,] "Francia" "1"
#> [4,] "Germania" "2"
#> [5,] "Germania" "2"
#> [6,] "Germania" "2"
#> [7,] "Francia" "1"
#> [8,] "Italia" "3"
#> [9,] "Italia" "3"
#> [10,] "Francia" "1"
Per impostare un livello di riferimento diverso si usa
relevel(), oppure si specifica l’ordine direttamente in
factor():
#> [1] Italia Germania Francia Germania Germania Germania Francia Italia
#> [9] Italia Francia
#> Levels: Italia Francia Germania
#> [1] Italia Germania Francia Germania Germania Germania Francia Italia
#> [9] Italia Francia
#> Levels: Italia Germania Francia
# → i livelli sono ordinati: Italia < Germania < Francia
# → le etichette restano "Italia", "Germania", "Francia"
factor(country, labels = c("FR", "GE", "IT"))#> [1] IT GE FR GE GE GE FR IT IT FR
#> Levels: FR GE IT
# → R ordina i livelli alfabeticamente: Francia, Germania, Italia
# → poi assegna le label in quell'ordine: France→"FR", Germany→"GE", Italy→"IT"
factor(country,
levels = c("Italia", "Germania", "Francia"), # definisci l'ordine
labels = c("IT", "GE", "FR")) # rinomina in corrispondenza#> [1] IT GE FR GE GE GE FR IT IT FR
#> Levels: IT GE FR
⚠️ Modificare
levels()direttamente rinomina i livelli (non ne cambia l’ordine interno). Attenzione a non scambiare le etichette!
#> [1] "Francia" "Germania" "Italia"
levels(countryf2) <- c("Italia", "Germania", "Francia") # rinomina i livelli
cbind(countryf, countryf2)#> countryf countryf2
#> [1,] 3 3
#> [2,] 2 2
#> [3,] 1 1
#> [4,] 2 2
#> [5,] 2 2
#> [6,] 2 2
#> [7,] 1 1
#> [8,] 3 3
#> [9,] 3 3
#> [10,] 1 1
age <- c(47, 44, 44, 40, 38, 36, 42, 34, 34, 44)
tapply(age, countryf, mean) # media dell'età per paese#> Francia Germania Italia
#> 43.33333 39.50000 38.33333
#> [1] 1 1 2 1 1 2 1 2 2 2
#> Levels: 1 2
#> [1] "1" "2"
#> Factor w/ 2 levels "F","M": 1 1 2 1 1 2 1 2 2 2
Esercizio 12
Definiscix <- c(5, 12, 13, 12). Converti questo vettore in factor e ispeziona la struttura. Come vengono definiti i livelli?
#> Factor w/ 3 levels "5","12","13": 1 2 3 2
#> [1] "5" "12" "13"
Esercizio 13
Crea un factor dalla sequenzac("1", "1", "0", "1", "1", "0").
Cosa restituisconolength()emode()?
#> [1] 6
#> [1] "numeric"
#> Factor w/ 2 levels "0","1": 2 2 1 2 2 1
Esercizio 14
Converti il factor del punto precedente assegnando le etichette"f"e"m"ai livelli"0"e"1". Cosa producetable()?
#> [1] f f m f f m
#> Levels: f m
#> x2
#> f m
#> 4 2
Esercizio 15
Esegui il codice seguente e poi rispondi: cosa succede av1quando modifichi i suoi livelli? In cosa differiscev2dav1?
v1 <- factor(letters[1:5])
levels(v1) <- rev(levels(v1))
# In v1 si RINOMINANO i livelli: "a" diventa "e", "b" diventa "d", ecc.
# Gli elementi cambiano etichetta, non posizione interna
v2 <- factor(letters[1:5], levels = rev(letters[1:5]))
# In v2 si cambia l'ORDINE dei livelli: "e" < "d" < "c" < "b" < "a"
# Gli elementi mantengono il loro valore, ma l'ordinamento cambia
v1#> [1] e d c b a
#> Levels: e d c b a
#> [1] a b c d e
#> Levels: e d c b a
- (es. x[-3])
esclude elementi, non crea valori negativi.Warning.[[i]]
per estrarre un elemento, [i] per ottenere una
sotto-lista.levels() rinomina le etichette;
usare factor(..., levels = ...) cambia
l’ordine.<- # Operatore assegnamento
# TIPI: numeric, integer, character, logical
str(x) # mostra tipo e struttura di x
class(x) # classe dell'oggetto x
typeof(x) # tipo interno di x
mode(x) # tipo
# verifica tipo
is.numeric(x) # x contiene valori numerici?
is.integer(x) # x contiene valori interi?
is.logical(x) # x contiene valori booleani?
is.character(x) # x contiene stringhe?
# converte tipo
as.numeric(x) # conversione di x a valori numerici
as.integer(x) # conversione di x a valori interi
as.logical(x) # conversione di x a valori booleani
as.character(x) # conversione di x a stringhe
# Concatenamento stringhe
paste("a", "b") # concatenamento di "a" e "b" (spaziatura)
paste0("a", "b") # concatenamento di "a" e "b" (no spaziatura)
paste0("a", "b", sep = "-") # concatenamento di "a" e "b" (separazione trattino)
# VETTORI
c(1, 2, 3) # crea vettore di valori numerici
c("a", "b", "c") # crea vettore di stringhe
c(T, F, FALSE) # crea vettore di booleani
1:10 # sequenza intera
seq(1, 10, by=0.2) # sequenza con passo 0.2
rep(x, times = n) # ripetizione di x n volte
rep(x, each = n) # ripetizione di ogni elemento di x n volte
# SUBSETTING
x[i] # per indice
x[c(i,j,k)] # per indici
x[i:j] # range
x[-i] # esclude
x[x > 5] # per condizione
x[c(T, F, T)] # per vettore logico
names(x); x["nome"] #nome elementi e accesso per nome
# Operatori aritmetici
+, -, *, /, ^. %%, %/%
# Operatori relazionali
>, >=, ==, <=, <
# Funzioni matematiche
log(x); exp(x); sqrt(x); abs(x)
# Condizioni logiche
! # diverso
| # OR
& # AND
# Valori speciali
NA/NaN/Inf/NULL
# verifica presenza valori speciali
is.na(), is.nan(), is.null(), is.infinite()
# Operatori logici
all(x>0) # tutte le condizioni verificate
any(x>0) # almeno una condizione verificata
which(x > 0) # indici dei TRUE
# STATISTICHE
length(x) # lunghezza
sum(x) # somma
mean(x) # media
max(x) # massimo
min(x) # minimo
range(x) # range
sort(x, decreasing = F) # ordinamento
order(x) # indici per ordinamento
rev(x) # invertire
# MATRICI
matrix(x, nrow = r, ncol = c, byrow = TRUE) # creazione
nrow(m); ncol(m); dim(m) # dimensioni
rownames(m); colnames(m) # nomi righe/colonne
m[i, j]; m[i, ]; m[, j] # Accesso elemento/riga/colonna
is.matrix(m)
as.matrix(x)
# Funzioni su matrici
A %*% B # prodotto matriciale
crossprod(A, B) # t(A) %*% B
tcrossprod(A, B) # A %*% t(B)
det(A) # determinante di A
t(A) # trasposta di A
solve(A) # inversa matrice A
solve(A,b) # soluzione sistema lineare Ax=b
diag(A) # estrazione diagonale di A
diag(a) # matrice diagonale con a su diagonale
diag(3) # Matrice identità 3x3
# ARRAY
array(x, dim = c(i,j,k)) # Array di dimensione i,j,k
x[i,j,k]; x[i,j,]; x[i,,] # Accesso elementi/fette
is.array(x)
# LISTE
list(x = x, A = A)
# Estrazione elementi, da vettore e da matrice
l[[1]]; l[[1]][3]; l[[1]][1,1]
l[["A"]]; l$A # Accesso per nome
names(l) # nomi elementi lista
c(l1, l2) # unione liste l1 e l2
# FATTORI
factor(x) # Conversione a fattore
# Conversione a fattore con livelli e etichette
factor(x, levels = a, labels = b)
is.factor(x) # verifica
levels(x) # livelli
relevel(x, a) # Cambia i livelli
# funzione utile fattori
tapply(x,g, FUN) # applica FUN a x per gruppo
table(g) # tabella di frequenza
# Altro
runif(10) #generazione di 10 numeri casuali da U(0,1)
sample(x) # campioni casulai e ripetizioni
letters[1:3] #prime tre lettere alfabeto
system.time() #controllo tempi di esecuzione