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:

Ejemplo de función Aplicar() en R
Ejemplo de función aplicar() en R

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