apply(), lapply(), sapply(), tapply() Funzione in R con esempi
Questo tutorial mira a introdurre la raccolta di funzioni apply(). La funzione apply() è la più basilare di tutte le raccolte. Impareremo anche sapply(), lapply() e tapply(). La raccolta apply può essere vista come un sostituto del loop.
La raccolta apply() è inclusa in sono essenziale pacchetto se tu installa R con Anaconda. La funzione apply in R può essere alimentata con molte funzioni per eseguire applicazioni ridondanti su una raccolta di oggetti (frame di dati, elenco, vettore, ecc.). Lo scopo di apply() è principalmente quello di evitare usi espliciti di costrutti di loop. Possono essere utilizzati per un elenco di input, una matrice o un array e applicano una funzione. Qualsiasi funzione può essere passata a apply().
funzione applica()
applicare() accetta il frame o la matrice di dati come input e fornisce l'output in un vettore, elenco o array. Fare domanda a funzione in R viene utilizzato principalmente per evitare usi espliciti di costrutti di loop. È la più basilare di tutte le raccolte che possono essere utilizzate su matrici.
Questa funzione accetta 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 è sommare una matrice su tutte le colonne. Il codice apply(m1, 2, sum) applicherà la funzione somma alla matrice 5×6 e restituirà la somma di ogni colonna accessibile nel set di dati.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Produzione:
pratica migliore: memorizzare i valori prima di stamparli sulla console.
funzione lapply()
lapply() la funzione è utile per eseguire operazioni sugli oggetti dell'elenco e restituisce un oggetto dell'elenco della stessa lunghezza del set originale. lappy() restituisce una lista di lunghezza simile all'oggetto lista di input, ciascun elemento del quale è il risultato dell'applicazione di FUN all'elemento corrispondente della lista. Lapply in R prende la lista, il vettore o il frame di dati come input e fornisce l'output nella 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() è un elenco. lapply() può essere utilizzato per altri oggetti come frame di dati ed elenchi.
La funzione lapply() non necessita di MARGINE.
Un esempio molto semplice può essere quello di modificare il valore della stringa di una matrice in minuscolo con la funzione tolower. Costruiamo una matrice con i nomi dei film famosi. Il nome è in formato maiuscolo.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Produzione:
## 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)
Produzione:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
funzione sapply()
sapply() la funzione accetta una lista, un vettore o un frame di dati come input e fornisce l'output in un vettore o matrice. È utile per le operazioni sugli oggetti della lista e restituisce un oggetto della lista della stessa lunghezza del set originale. La funzione Sapply in R svolge 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 set di dati delle auto.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Produzione:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Produzione:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Produzione:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Produzione:
## speed dist ## 25 120
Possiamo usare una funzione incorporata dall'utente in lapply() o sapply(). Creiamo una funzione denominata 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
Uscita
## speed dist ## 14.5 61.0
Sapply in R è più efficiente di lapply() nell'output restituito perché sapply() memorizza i valori direttamente in un vettore. Nel prossimo esempio vedremo che non è sempre così.
Possiamo riassumere la differenza tra apply(), sapply() e `lapply() nella seguente tabella:
Funzione | argomenti | Obiettivo | Ingresso | Uscita |
---|---|---|---|---|
applicare | applica(x, MARGINE, DIVERTIMENTO) | Applicare una funzione alle righe o alle colonne o a entrambe | Frame o matrice di dati | vettore, elenco, array |
lappola | lapply(X, DIVERTIMENTO) | Applicare una funzione a tutti gli elementi dell'input | Elenco, vettore o frame di dati | stratagemma |
sapply | sapply(X, DIVERTIMENTO) | Applicare una funzione a tutti gli elementi dell'input | Elenco, vettore o frame di dati | vettore o matrice |
Vettore di fetta
Possiamo usare lapply() o sapply() intercambiabili per suddividere un frame di dati. Creiamo una funzione, lower_average(), che prende un vettore di valori numerici e restituisce un vettore che contiene solo i valori strettamente superiori alla media. Confrontiamo entrambi i risultati con la funzione identico().
below_ave <- function(x) { ave <- mean(x) return(x[x > ave]) } dt_s<- sapply(dt, below_ave) dt_l<- lapply(dt, below_ave) identical(dt_s, dt_l)
Produzione:
## [1] TRUE
funzione tapply()
tapply() calcola una misura (media, mediana, minimo, massimo, ecc.) o una funzione per ciascuna variabile fattore in un vettore. È una funzione molto utile che ti consente di creare un sottoinsieme di un vettore e quindi applicare alcune funzioni a ciascuno dei sottoinsieme.
tapply(X, INDEX, FUN = NULL) Arguments: -X: An object, usually a vector -INDEX: A list containing factor -FUN: Function applied to each element of x
Parte del lavoro di uno scienziato o di un ricercatore di dati è calcolare riepiloghi di variabili. Ad esempio, misura la media o i dati di gruppo in base a una caratteristica. La maggior parte dei dati sono raggruppati per ID, città, paesi e così via. Il riepilogo del gruppo rivela modelli più interessanti.
Per capire come funziona, utilizziamo il set di dati dell'iride. Questo set di dati è molto famoso nel mondo del machine learning. Lo scopo di questo set di dati è prevedere la classe di ciascuna delle tre specie di fiori: Sepal, Versicolor, Virginica. Il set di dati raccoglie informazioni per ciascuna specie sulla loro lunghezza e larghezza.
Come lavoro preliminare, possiamo calcolare la mediana della lunghezza per ciascuna specie. Tapply in R è un modo rapido per eseguire questo calcolo.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Produzione:
## setosa versicolor virginica ## 3.4 2.8 3.0