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

por | Sep 20, 2016 | R | 5 Comentarios

Apply

La función apply nos permite aplicar una función a una matriz, lista o vector que se le pase cómo parámetro.

Argumento 1: matriz, lista o vector

Argumento 2: Puede tomar valores 1 o 2

  • 1 para operar sobre las filas
  • 2 para operar sobre las columnas

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

Ejemplos de funciones: sum, mean, count,…

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

5 Comentarios

  1. Eduard Martínez

    Buen aporte Diego!

    Responder
  2. Alejandro

    Gran aporte, me valio para entender la funció apply!

    Responder
  3. whay

    Diego tienes un error y es que en el Argumento 2: realmente la opción uno es para operar sobre las filas y la opción 2 es para operar sobre las columnas.

    Responder
    • Diego Calvo

      Buenas whay, he revisado lo que me comentas y lo he corregido

      Responder
  4. Oreste Bruno

    Muy bien explicadas las diferencias de estas funciones.

    Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *