R apply(), lapply(), sapply(), tapply() con ejemplos
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 las distancias de frenado de los automóviles a partir del conjunto de datos de automóviles.
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
Salida
## 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 | Salida |
---|---|---|---|---|
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