Questo tutorial ha lo scopo di introdurre la collezione di funzioni apply(). La funzione apply() è la più elementare di tutte le collezioni. Impareremo anche sapply(), lapply() e tapply(). L’insieme apply può essere visto come un sostituto del loop.
La collezione apply() è inclusa nel pacchetto r essential se installate R con Anaconda. La funzione apply() può essere alimentata con molte funzioni per eseguire applicazioni ridondanti su una collezione di oggetti (data frame, lista, vettore, ecc.). Lo scopo di apply() è principalmente quello di evitare l’uso esplicito di costrutti di loop. Possono essere utilizzati per una lista, matrice o array di input e applicare una funzione. Qualsiasi funzione può essere passata in apply().
In questo tutorial, imparerete
- la funzione apply()
- la funzione lapply( )
- la funzione sapply()
- Slice vector
- funzione tapply()
funzione apply()
apply() prende Data frame o matrice come input e dà come output un vettore, lista o array. La funzione apply() è usata principalmente per evitare l’uso esplicito dei costrutti di loop. È la più elementare di tutte le collezioni che possono essere usate su una matrice.
Questa funzione prende 3 argomenti:
apply(X, MARGIN, FUN)Here:-x: an array or matrix-MARGIN: take a value or range between 1 and 2 to define where to apply the function:-MARGIN=1`: the manipulation is performed on rows-MARGIN=2`: the manipulation is performed on columns-MARGIN=c(1,2)` the manipulation is performed on rows and columns-FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
L’esempio più semplice è quello di sommare una matrice su tutte le colonne. Il codice apply(m1, 2, sum) applicherà la funzione sum alla matrice 5×6 e restituirà la somma di ogni colonna accessibile nel dataset.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Output:
Pratica migliore: Memorizzare i valori prima di stamparli nella console.
funzione lapply()
lapply() è utile per eseguire operazioni su oggetti lista e restituisce un oggetto lista della stessa lunghezza dell’insieme originale. lappy() restituisce una lista della stessa lunghezza dell’oggetto lista di input, ogni elemento della quale è il risultato dell’applicazione di FUN all’elemento corrispondente della lista. lapply() prende lista, vettore o data frame come input e dà output in lista.
lapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
l in lapply() sta per lista. La differenza tra lapply() e apply() sta nel ritorno dell’output. L’output di lapply() è una lista. lapply() può essere usata per altri oggetti come data frame e liste.
lapply() non ha bisogno di MARGIN.
Un esempio molto semplice può essere quello di cambiare il valore della stringa di una matrice in minuscolo con la funzione tolower. Costruiamo una matrice con il nome dei film famosi. Il nome è in formato maiuscolo.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Output:
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
Possiamo usare unlist() per convertire la lista in un vettore.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Output:
## chr "spyderman" "batman" "vertigo" "chinatown"
funzione sapply()
sapply() prende come input una lista, un vettore o un data frame e dà come output un vettore o una matrice. È utile per operazioni su oggetti lista e restituisce un oggetto lista della stessa lunghezza dell’insieme originale. La funzione sapply() fa lo stesso lavoro della funzione lapply() ma restituisce un vettore.
sapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
Possiamo misurare la velocità minima e le distanze di arresto delle auto dal dataset auto.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Output:
## $speed## 4## $dist## 2
smn_cars
Output:
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Output:
## $speed## 25## $dist## 120
smxcars
Output:
## speed dist ## 25 120
Possiamo usare una funzione integrata dall’utente in lapply() o sapply(). Creiamo una funzione chiamata avg per calcolare la media del minimo e del massimo del vettore.
avg <- function(x) { ( min(x) + max(x) ) / 2}fcars <- sapply(dt, avg)fcars
Output
## speed dist## 14.5 61.0
la funzione sapply() è più efficiente di lapply() nell’output restituito perché sapply() memorizza i valori direttamente in un vettore. Nel prossimo esempio, vedremo che questo non è sempre il caso.
Possiamo riassumere la differenza tra apply(), sapply() e `lapply() nella seguente tabella:
Funzione |
Argomenti |
Obiettivo |
Input |
Output |
---|---|---|---|---|
apply |
apply(x, MARGIN, FUN) |
Applica una funzione alle righe o alle colonne o a entrambe |
Data frame o matrice |
vettore, lista, array |
lapply |
lapply(X, FUN) |
Applica una funzione a tutti gli elementi dell’input |
Lista, vettore o data frame |
lista |
sapply |
sappy(X FUN) |
Applica una funzione a tutti gli elementi dell’input |
Lista, vettore o data frame |
vettore o matrice |
Affetta vettore
Possiamo usare lapply() o sapply() intercambiabili per affettare un data frame. Creiamo una funzione, below_average(), che prende un vettore di valori numerici e restituisce un vettore che contiene solo i valori che sono strettamente sopra la media. Confrontiamo entrambi i risultati con la funzione identica().
below_ave <- function(x) { ave <- mean(x) return(x)}dt_s<- sapply(dt, below_ave)dt_l<- lapply(dt, below_ave)identical(dt_s, dt_l)
Output:
## TRUE
funzione tapply()
tapply() calcola una misura (media, mediana, min, max, ecc.) o una funzione per ogni variabile fattore in un vettore. È una funzione molto utile che permette di creare un sottoinsieme di un vettore e poi applicare alcune funzioni a ciascun sottoinsieme.
Parte del lavoro di uno scienziato dei dati o dei ricercatori è quello di calcolare sintesi di variabili. Per esempio, misurare la media o raggruppare i dati in base a una caratteristica. La maggior parte dei dati sono raggruppati per ID, città, paesi e così via. Riassumendo per gruppo si rivelano modelli più interessanti.
Per capire come funziona, usiamo il dataset dell’iride. Questo dataset è molto famoso nel mondo del machine learning. Lo scopo di questo dataset è prevedere la classe di ciascuna delle tre specie di fiori: Sepal, Versicolor, Virginica. Il dataset raccoglie informazioni per ogni specie sulla loro lunghezza e larghezza.
Come lavoro preliminare, possiamo calcolare la mediana della lunghezza per ogni specie. tapply() è un modo veloce per eseguire questo calcolo.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Output:
## setosa versicolor virginica ## 3.4 2.8 3.0