R apply(), lapply(), sapply(), tapply() con ejemplos
โก Resumen inteligente
Las funciones apply(), lapply(), sapply() y tapply() forman la familia apply de R, una alternativa vectorizada a los bucles explรญcitos que aplica una funciรณn elegida a travรฉs de matrices, listas, vectores y datos agrupados para devolver resultados concisos.

Este tutorial tiene como objetivo presentar la colecciรณn de funciones apply(). La funciรณn apply() es la mรกs bรกsica de toda la colecciรณn. Tambiรฉn aprenderemos sapply(), lapply() y tapply(). La colecciรณn de aplicaciรณn puede verse como un sustituto del bucle.
La colecciรณn apply() estรก incluida con r esencial paquete si tu instalar R con Anaconda. La funciรณn Aplicar en R se puede alimentar con muchas funciones para realizar aplicaciones redundantes en una colecciรณn de objetos (marco de datos, lista, vector, etc.). El propรณsito de apply() es principalmente evitar usos explรญcitos de construcciones de bucle. Se pueden usar para una lista de entrada, matriz o matriz y aplicar una funciรณn. Cualquier funciรณn se puede pasar a apply().
funciรณn aplicar()
aplicar() toma un marco de datos o una matriz como entrada y proporciona una salida en un vector, lista o matriz. Aplicar funciรณn en R se utiliza principalmente para evitar usos explรญcitos de construcciones de bucle. Es la colecciรณn mรกs bรกsica de todas y se puede utilizar sobre matrices.
Esta funciรณn toma 3 argumentos:
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>
El ejemplo mรกs sencillo es sumar una matriz sobre todas las columnas. El cรณdigo apply(m1, 2, sum) aplicarรก la funciรณn de suma a la matriz 5ร6 y devolverรก la suma de cada columna accesible en el conjunto de datos.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Salida:

Prรกctica mejorada: Almacene los valores antes de imprimirlos en la consola.
funciรณn lapply()
laply() La funciรณn es รบtil para realizar operaciones en objetos de lista y devuelve un objeto de lista de la misma longitud que el conjunto original. lappy() devuelve una lista de longitud similar a la del objeto de lista de entrada, cada elemento del cual es el resultado de aplicar FUN al elemento correspondiente de la lista. Lapply en R toma una lista, un vector o un marco de datos como entrada y proporciona una salida en la lista.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l en lapply() significa lista. La diferencia entre lapply() y apply() radica en el retorno de salida. La salida de lapply() es una lista. lapply() se puede utilizar para otros objetos como marcos de datos y listas.
La funciรณn lapply() no necesita MARGEN.
Un ejemplo muy sencillo puede ser cambiar el valor de cadena de una matriz a minรบsculas con la funciรณn tolower. Construimos una matriz con el nombre de las pelรญculas famosas. El nombre estรก en formato mayรบscula.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Salida:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Podemos usar unlist() para convertir la lista en un vector.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Salida:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
funciรณn sapply()
aplicar() La funciรณn toma una lista, un vector o un marco de datos como entrada y proporciona una salida en un vector o matriz. Es รบtil para operaciones en objetos de lista y devuelve un objeto de lista de la misma longitud que el conjunto original. La funciรณn Sapply en R hace el mismo trabajo que la funciรณn lapply() pero devuelve un vector.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Podemos medir la velocidad mรญnima y detenernos.ping distancias de los coches del conjunto de datos de coches.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Salida:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Salida:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Salida:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Salida:
## speed dist ## 25 120
Podemos utilizar una funciรณn incorporada por el usuario en lapply() o sapply(). Creamos una funciรณn llamada avg para calcular el promedio del mรญnimo y el mรกximo del vector.
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
Resultado
## speed dist ## 14.5 61.0
Sapply en R es mรกs eficiente que lapply() en la salida devuelta porque sapply() almacena valores directamente en un vector. En el siguiente ejemplo veremos que este no es siempre el caso.
Podemos resumir la diferencia entre apply(), sapply() y `lapply() en la siguiente tabla:
| Funciรณn | Argumentos | Objetivo | Entrada | Resultado |
|---|---|---|---|---|
| aplicar | aplicar(x, MARGEN, DIVERSIรN) | Aplicar una funciรณn a las filas o columnas o ambas. | Marco de datos o matriz | vector, lista, matriz |
| lapear | aplicar(X, DIVERSIรN) | Aplicar una funciรณn a todos los elementos de la entrada. | Lista, vector o marco de datos | lista |
| aplicar savia | aplicar(X, DIVERSIรN) | Aplicar una funciรณn a todos los elementos de la entrada. | Lista, vector o marco de datos | vector o matriz |
vector de rebanada
Podemos usar lapply() o sapply() intercambiables para dividir un marco de datos. Creamos una funciรณn, under_average(), que toma un vector de valores numรฉricos y devuelve un vector que solo contiene los valores que estรกn estrictamente por encima del promedio. Comparamos ambos resultados con la funciรณn idรฉntica().
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)
Salida:
## [1] TRUE
funciรณn tapply()
tocar() calcula una medida (media, mediana, mรญnimo, mรกximo, etc.) o una funciรณn para cada variable de factor en un vector. Es una funciรณn muy รบtil que te permite crear un subconjunto de un vector y luego aplicar algunas funciones a cada uno de los subconjuntos.
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 trabajo de un cientรญfico o investigador de datos es calcular resรบmenes de variables. Por ejemplo, mida el promedio o los datos grupales en funciรณn de una caracterรญstica. La mayorรญa de los datos estรกn agrupados por DNI, ciudad, paรญses, etc. Resumir el grupo revela patrones mรกs interesantes.
Para entender cรณmo funciona, usemos el conjunto de datos del iris. Este conjunto de datos es muy famoso en el mundo del aprendizaje automรกtico. El propรณsito de este conjunto de datos es predecir la clase de cada una de las tres especies de flores: Sรฉpalo, Versicolor, Virginica. El conjunto de datos recopila informaciรณn para cada especie sobre su largo y ancho.
Como trabajo previo, podemos calcular la mediana de la longitud para cada especie. Tapply en R es una forma rรกpida de realizar este cรกlculo.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Salida:
## setosa versicolor virginica ## 3.4 2.8 3.0
