Salta al contenuto
R

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.

Contenuto redatto con l'assistenza di strumenti di intelligenza artificiale e rivisto dalla redazione di Codegrind, che ne è responsabile. Hai trovato un errore? Scrivici.