Liste in R
Le liste in R sono strutture dati versatili che, a differenza dei vettori, possono contenere elementi di tipi diversi. Una lista può includere numeri, stringhe, vettori, altre liste e persino funzioni. Questa flessibilità le rende indispensabili per gestire dati complessi e strutturati.
Creare Liste con list()
La funzione list() crea una nuova lista che può contenere qualsiasi tipo di dato:
# Lista semplice con tipi misti
studente <- list("Marco", 22, TRUE, 28.5)
print(studente)
# [[1]]
# [1] "Marco"
#
# [[2]]
# [1] 22
#
# [[3]]
# [1] TRUE
#
# [[4]]
# [1] 28.5
A differenza di un vettore, ogni elemento della lista mantiene il proprio tipo originale senza alcuna conversione automatica.
Liste con Nomi
Assegnare nomi agli elementi rende la lista molto più leggibile e facile da usare:
# Lista con nomi
persona <- list(
nome = "Laura",
eta = 30,
citta = "Roma",
voti = c(28, 30, 25, 27)
)
print(persona)
# $nome
# [1] "Laura"
#
# $eta
# [1] 30
#
# $citta
# [1] "Roma"
#
# $voti
# [1] 28 30 25 27
I nomi degli elementi possono essere verificati con la funzione names():
print(names(persona))
# [1] "nome" "eta" "citta" "voti"
Accesso agli Elementi
R offre diverse modalità per accedere agli elementi di una lista. La differenza tra [], [[]] e $ è fondamentale:
corso <- list(
titolo = "Statistica",
crediti = 9,
studenti = c("Anna", "Marco", "Sara")
)
# [] restituisce una sotto-lista
print(corso[1])
# $titolo
# [1] "Statistica"
print(class(corso[1]))
# [1] "list"
# [[]] restituisce l'elemento stesso
print(corso[[1]])
# [1] "Statistica"
print(class(corso[[1]]))
# [1] "character"
# Accesso per nome con [[]]
print(corso[["crediti"]])
# [1] 9
# Operatore $ per accesso diretto per nome
print(corso$titolo)
# [1] "Statistica"
# Accedere a un elemento dentro un vettore nella lista
print(corso$studenti[2])
# [1] "Marco"
La regola pratica da ricordare: [] restituisce sempre una lista, [[]] e $ restituiscono il contenuto dell’elemento.
Aggiungere e Rimuovere Elementi
Le liste in R sono dinamiche e possono essere modificate dopo la creazione:
# Creare una lista iniziale
libro <- list(titolo = "Il Nome della Rosa", autore = "Umberto Eco")
# Aggiungere un elemento con $
libro$anno <- 1980
print(libro)
# $titolo
# [1] "Il Nome della Rosa"
#
# $autore
# [1] "Umberto Eco"
#
# $anno
# [1] 1980
# Aggiungere con [[]]
libro[["pagine"]] <- 512
print(libro$pagine)
# [1] 512
# Rimuovere un elemento assegnando NULL
libro$pagine <- NULL
print(names(libro))
# [1] "titolo" "autore" "anno"
# Aggiungere più elementi contemporaneamente
libro <- c(libro, list(genere = "Romanzo", editore = "Bompiani"))
print(names(libro))
# [1] "titolo" "autore" "anno" "genere" "editore"
Liste Annidate
Le liste possono contenere altre liste, creando strutture dati complesse e gerarchiche:
# Lista annidata per rappresentare un'universitÃ
universita <- list(
nome = "Sapienza",
facolta = list(
ingegneria = list(
corsi = c("Analisi I", "Fisica", "Informatica"),
studenti = 1500
),
lettere = list(
corsi = c("Letteratura", "Storia", "Filosofia"),
studenti = 800
)
)
)
# Accesso a elementi annidati
print(universita$facolta$ingegneria$corsi)
# [1] "Analisi I" "Fisica" "Informatica"
print(universita$facolta$lettere$studenti)
# [1] 800
# Accesso equivalente con [[]]
print(universita[["facolta"]][["ingegneria"]][["studenti"]])
# [1] 1500
Funzioni Utili per le Liste
R offre diverse funzioni per lavorare efficacemente con le liste:
prodotto <- list(
nome = "Laptop",
prezzo = 999.99,
specifiche = c("16GB RAM", "512GB SSD", "Intel i7"),
disponibile = TRUE
)
# Numero di elementi
print(length(prodotto))
# [1] 4
# Struttura dettagliata della lista con str()
str(prodotto)
# List of 4
# $ nome : chr "Laptop"
# $ prezzo : num 1000
# $ specifiche : chr [1:3] "16GB RAM" "512GB SSD" "Intel i7"
# $ disponibile: logi TRUE
La funzione str() è particolarmente utile per esplorare liste complesse, poiché mostra la struttura completa in modo compatto.
Conversione Lista-Vettore con unlist()
La funzione unlist() converte una lista in un vettore, appiattendo tutta la struttura:
# Lista numerica
valori <- list(a = 1, b = 2, c = 3, d = 4)
vettore <- unlist(valori)
print(vettore)
# a b c d
# 1 2 3 4
print(class(vettore))
# [1] "numeric"
# Lista con tipi misti: tutto diventa character
mista <- list(10, "ciao", TRUE)
risultato <- unlist(mista)
print(risultato)
# [1] "10" "ciao" "TRUE"
# unlist() su liste annidate
annidata <- list(x = c(1, 2), y = c(3, 4, 5))
appiattita <- unlist(annidata)
print(appiattita)
# x1 x2 y1 y2 y3
# 1 2 3 4 5
Iterazione sulle Liste
Per applicare operazioni su ogni elemento di una lista, si usa lapply() o sapply():
numeri <- list(a = 1:5, b = 6:10, c = 11:15)
# lapply restituisce una lista
medie <- lapply(numeri, mean)
print(medie)
# $a
# [1] 3
#
# $b
# [1] 8
#
# $c
# [1] 13
# sapply semplifica il risultato in un vettore
medie_vettore <- sapply(numeri, mean)
print(medie_vettore)
# a b c
# 3 8 13
Conclusione
Le liste sono una struttura dati fondamentale in R, capace di contenere elementi eterogenei e organizzarli in strutture complesse. La padronanza degli operatori di accesso [[]] e $, la capacità di creare liste annidate e l’uso di funzioni come str(), unlist(), lapply() e sapply() sono competenze essenziali per qualsiasi programmatore R. Le liste sono inoltre alla base dei data frame, che non sono altro che liste di vettori della stessa lunghezza.