Funciones apply, lapply, sapply, tapply, mapply y vapply en R

Apply

Aplica una función a una matriz, lista o vector que se le pase como parámetro.

Argumento 1: matriz, lista o vector

Argumento 2: 1 para operar sobre las columnas y 2 para operar sobre las filas

Argumento 3: Operador que se aplica sobre filas o columnas, según indique el argumento 2.

Función apply en R

mi_matriz <- matrix(1:9,nrow = 3, ncol = 3)
mi_matriz
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

apply(mi_matriz,2,sum)
[1]  6 15 24

Lapply

Se diferencia con apply en que opera con listas. Recibe una lista y devuelve una lista

A <- matrix(1:9,nrow = 3, ncol = 3)
B <- matrix(11:19,nrow = 3, ncol = 3)
C <- matrix(21:29,nrow = 3, ncol = 3)
mi_lista <- list(A,B,C)
lapply(mi_lista,"[",1,1)
[[1]]
[1] 1

[[2]]
[1] 11

[[3]]
[1] 21

Sapply

Se diferencia con apply en que opera con listas. Recibe una lista y devuelve un vector

Ejemplo 1:

sapply(mi_lista,"[",1,1)
[1]  1 11 21

Ejemplo 2: Unificar categorias sustituyendo por elementos de un conjunto

# Ampliar el conjunto de datos
datos$sexo <- c("masculino","h", "hombre", "h","mujer","femenino", "mujer", "m")
  
# Ver que valores toma la variable
unique(datos$sexo)
## [1] "masculino" "h"         "hombre"    "mujer"     "femenino"  "m"
# Definir los nombres que pueden aparecer en el cojunto de datos
nombres.hombre <- c("masculino", "hombre", "h")
nombres.mujer <- c("femenino", "mujer", "m")

library(stringi)
datos$sexo <- tolower(datos$sexo)
datos$sexo <- sapply(as.vector(datos$sexo), function(x) if(x %in% nombres.hombre) "Hombre" else x )
datos$sexo <- sapply(as.vector(datos$sexo), function(x) if(x %in% nombres.mujer) "Mujer" else x )

datos$sexo
## [1] "Hombre" "Hombre" "Hombre" "Hombre" "Mujer"  "Mujer"  "Mujer"  "Mujer"

 

Tapply

Realiza una operación (parámetro 3) respecto a un vector (parámetro 1) agrupada por los factores que se indiquen como argumento (parámetro 2).

x <- 1:20
y <- factor(rep(letters[1:5], each = 4))
x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
y
 [1] a a a a b b b b c c c c d d d d e e e e
Levels: a b c d e

tapply(x, y, sum)
 a  b  c  d  e 
10 26 42 58 74

Mapply

Realiza operaciones entre matrices y devuelve una lista o vector, a continuación se muestran algunas de las operaciones que admite:

Suma el primer elemento de cada vector, después el segundo y así sucesivamente:

mapply(sum, 1:5, 1:5, 1:5) 
[1]  3  6  9 12 15

Repite cada elemento del primer vector el número de veces que indique el segundo vector:

mapply(rep, 1:4, 4:1)
[[1]]
 [1] 1 1 1 1
[[2]]
 [1] 2 2 2
[[3]]
 [1] 3 3
[[4]]
 [1] 4

Vapply

Devuelve un vector con la longitud que tiene cada una de las listas introducidas como parámetro.

x <- list(A = 1, B = 1:3, C = 1:7)
x
$a
[1] 1
$b
[1] 1 2 3
$c
[1] 1 2 3 4 5 6 7

vapply(x, FUN = length, FUN.VALUE = 0L)
a b c 
1 3 7