00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.