lettura facile

Le funzioni apply, lapply e sapply del linguaggio R

Le funzioni apply, lapply e sapply sono fondamentali in R e sono utilissime quando si tratta di manipolare dati e applicare una funzione a ogni elemento di una struttura dati (es. array, matrici, vettori, liste, ecc. ) in maniera efficiente.

A cosa servono? Queste funzioni sono davvero potenti perché ti permettono di evitare dei cicli espliciti (for o while) e rendere il tuo codice più pulito. In pratica, ti consentono di scrivere codice in R in modo più efficiente, elegante e facile da leggere.

Vediamole in dettaglio.

Apply

La funzione apply applica una funzione alle righe o alle colonne di un array o di una matrice X.

apply(X, MARGIN, FUN, ...)

Questa funzione ha tre parametri:

  • X è un array o una matrice
  • MARGIN indica se vuoi lavorare sulle righe (1) o sulle colonne (2)
  • FUN è la funzione che vuoi applicare agli elementi.

La funzione apply applica la funzione agli elementi della matrice e ti restituisce il risultato.

A cosa serve? Ti permette di eseguire un'operazione su ogni riga o su ogni colonna di una matrice, senza dover scrivere un ciclo esplicito. Per questa ragione si chiama "apply", deriva dal verbo "applicare. In pratica, è un modo molto elegante per rendere il codice più compatto e leggibile.

Ecco un esempio pratico.

Definisci una matrice 3x3.

matrice <- matrix(1:9, nrow = 3)

Se la stampi puoi vedere la struttura dati della matrice composta da tre righe e tre colonne

print(matrice)

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

Immagina di voler calcolare la media di ogni riga della matrice.

Per farlo, puoi semplicemente usare apply specificando il margine 1 (per le righe) e la funzione desiderata che in questo caso è la funzione mean()

apply(matrice, 1, mean)

La funzione mean() calcola la media di ogni riga della matrice.

[1] 4 5 6

Ti faccio un altro esempio.

Immagina di voler calcolare la somma degli elementi di ogni colonna della matrice.

In questo caso devi usare apply specificando la funzione sum() e come margine 2 per le colonne.

apply(matrice, 2, sum)

La funzione sum somma i valori di ogni colonna della matrice.

[1]  6 15 24

Lapply

La funzione lapply è utile quando lavori con liste.

lapply(List, FUN, ...)

La funzione ha i seguenti parametri:

  • List è la lista a cui vuoi applicare la funzione.
  • FUN è la funzione da eseguire.

La funzione lapply prende una lista e applica una funzione a ogni elemento di questa lista.

La cosa bella è che ti restituisce sempre una lista. Per questa ragione inizia con la lettera "l", dove "lapply" sta per "list apply" ovvero "applicare alla lista".

Ecco un esempio pratico.

Definisci una lista con cinque elementi.

mia_lista <- list(5, 10, 15, 20, 25)

Per calcolare il quadrato degli elementi nella lista, usa la funzione lapply con una funzione anonima.

lapply(mia_lista, function(x) x^2)

In questo caso la funzione eleva al quadrato ogni elemento della lista di origine e restituisce una nuova lista.

[[1]]
[1] 25

[[2]]
[1] 100

[[3]]
[1] 225

[[4]]
[1] 400

[[5]]
[1] 625

Da notare che la vecchia lista non è stata modificata. La funzione lapply crea una nuova lista in uscita.

Sapply

La funzione sapply è un po' come lapply, ma con un tocco in più perché cerca di semplificare il risultato..

sapply(X, FUN, ..., simplify = TRUE)

Questa funzione ha tre parametri:

  • X è una lista, il vettore o qualsiasi altro oggetto su cui vuoi applicare la funzione.
  • FUN è la funzione che vuoi applicare ad ogni elemento di X. Può essere una funzione predefinita in R (come sum o mean) o una funzione definita dall'utente.
  • I puntini ... sono i parametri aggiuntivi che possono essere passati alla funzione.
  • simplify è un parametro con un valore logico che determina se sapply deve semplificare il risultato finale (TRUE) oppure no (FALSE). Di default è TRUE.

La funzione sapply itera su ciascun elemento di questo oggetto, applica la funzione e restituisce il risultato semplificato.

A cosa serve? Si chiama sapply perché "semplifica" il risultato di "apply". Viene utilizzata per applicare una funzione a ogni elemento di una lista o di un vettore, tentando poi di semplificare il risultato in un vettore o in una matrice, se è possibile. L'utilizzo di sapply è particolarmente utile quando vuoi una rappresentazione più compatta del risultato.

Ad esempio, definisci una lista con cinque elementi.

mia_lista <- list(5, 10, 15, 20, 25)

Poi calcola il quadrato degli elementi nella lista usando la funzione sapply con una funzione anonima.

sapply(mia_lista, function(x) x^2)

In questo caso il risultato finale è un array:

[1]  25 100 225 400 625

La funzione sapply è particolarmente utile quando vuoi ottenere il risultato in una struttura dati differente, più compatta, rispetto a quella di origine.

Quando usare apply, lapply e sapply

Quindi, quando usarle? Beh, apply è fantastica per operazioni su matrici.

La funzione lapply è, invece, ideale se lavori con liste e vuoi mantenere una struttura di lista come output.

Infine, sapply è utile quando preferisci un output più compatto.

Ricorda che se usi sapply e la lunghezza degli output varia, potresti non ottenere ciò che ti aspetti. In quei casi, lapply potrebbe essere una scelta più sicura. Per operazioni più complesse, ci sarebbe anche vapply, che è un po' più specifica ma ti dà più controllo sul tipo di output. Ti permette di scegliere la struttura di output in uscita. Ne parleremo in seguito in un tutorial dedicato.

Il mio consiglio è di giocare con queste funzioni, esplorarle con i tuoi dati, e vedere come possono aiutarti a fare le cose in modo più semplice e pulito.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin