13 outubro, 2021

Selo DC

Introdução

  • A família de funções da família apply, recebem o prefixo apply;
  • São funções do pacote base;
  • Objetivo: substituir o loop e vetorização
  • Algumas funções: apply(), lapply(), sapply(), tapply() e mapply()

Função apply()

apply(X, MARGIN, FUN, ..., simplify = TRUE),

em que:

  • X argumento que recebe o objeto matriz ou array,
  • MARGIN argumento que recebe 1, se a função em FUN deve ser aplicado na linha, ou recebe 2 se FUN deve ser aplicado nas colunas,
  • FUN argumento que recebe a função desejada,
  • ... argumento que recebe argumentos adicionais para FUN, e
  • simplify argumento lógico para retorno de resultados simplificados (TRUE) ou não (FALSE).

Exemplo

# 5 amostras
(am1 <- sample(x = 1:1000, size = 10, replace = TRUE))
##  [1] 562 575 346 146 266 903 283 964 318 100
(am2 <- sample(x = 1:1000, size = 10, replace = TRUE))
##  [1] 288 368 492 268 277 355 740 652 858 175
(am3 <- sample(x = 1:1000, size = 10, replace = TRUE))
##  [1] 373 860 997 391 839 196 798 672  99  75
(am4 <- sample(x = 1:1000, size = 10, replace = TRUE))
##  [1] 305 319 791 140 915 576 516 407 812 682
(am5 <- sample(x = 1:1000, size = 10, replace = TRUE))
##  [1] 602 453 525 774 589 812 112 680 622 333

Exemplo

# Amostras em colunas
amost_col <- matrix(c(am1, am2, am3, am4, am5), 10, 5); amost_col
##       [,1] [,2] [,3] [,4] [,5]
##  [1,]  562  288  373  305  602
##  [2,]  575  368  860  319  453
##  [3,]  346  492  997  791  525
##  [4,]  146  268  391  140  774
##  [5,]  266  277  839  915  589
##  [6,]  903  355  196  576  812
##  [7,]  283  740  798  516  112
##  [8,]  964  652  672  407  680
##  [9,]  318  858   99  812  622
## [10,]  100  175   75  682  333
# Calculando a media por coluna
apply(X = amost_col, MARGIN = 2, FUN = mean)
## [1] 446.3 447.3 530.0 546.3 550.2

Exemplo

# Amostras em linhas
amost_lin <- matrix(c(am1, am2, am3, am4, am5), 5, 10, byrow = TRUE); amost_lin
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]  562  575  346  146  266  903  283  964  318   100
## [2,]  288  368  492  268  277  355  740  652  858   175
## [3,]  373  860  997  391  839  196  798  672   99    75
## [4,]  305  319  791  140  915  576  516  407  812   682
## [5,]  602  453  525  774  589  812  112  680  622   333
# Calculando a media por linhas
apply(X = amost_lin, MARGIN = 1, FUN = mean)
## [1] 446.3 447.3 530.0 546.3 550.2

Exemplo

# Podemos tambem adicionar argumentos adicionais
# em FUN (Media truncada em 10%)
apply(X = amost_lin, MARGIN = 1, FUN = mean, trim = 0.1)
## [1] 424.875 430.000 528.500 551.000 572.250
# Usando o argumento simplify, o default: simplify = TRUE
apply(X = amost_lin, MARGIN = 1, FUN = mean, simplify = FALSE)
## [[1]]
## [1] 446.3
## 
## [[2]]
## [1] 447.3
## 
## [[3]]
## [1] 530
## 
## [[4]]
## [1] 546.3
## 
## [[5]]
## [1] 550.2

Função lapply()

A próxima função é lapply(), com sintaxe:

lapply(X, FUN, ...),

em que:

  • X argumento que recebe uma lista;
  • FUN argumento que recebe a função desejada, e
  • ... argumento que recebe argumentos adicionais para FUN.

Exemplo

# Lista
lapply(list(x = 1:10, y = 11:20), mean)
## $x
## [1] 5.5
## 
## $y
## [1] 15.5
lapply(list(x = 1:10, y = 11:20), "[[", 2)
## $x
## [1] 2
## 
## $y
## [1] 12
lapply(list(mat1 = matrix(1:12, 4, 3)), "[", , 2)
## $mat1
## [1] 5 6 7 8
matrix(1:12, 4, 3)
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Função sapply

A função seguinte é sapply(), que é um invólucro (wrapper) da função lapply(), e o acréscimo sintátivo do argumento padrão simplify = TRUE. Assim, a forma sintática dessa função, segue:

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE),

em que:

  • X argumento que recebe uma lista;
  • FUN argumento que recebe a função desejada;
  • ... argumento que recebe argumentos adicionais para FUN; e
  • simplify, argumento lógico, se TRUE retorna o resultado de forma simplificada, sendo um vetor atoômico, matriz ou array; se FALSE o retorno é uma lista;
  • USE.NAMES, argumento lógico; se TRUE é retornado o nome inserido nos objetos da lista; se FALSE, caso contrário.

Exemplo

lapply(list(1:10, 11:20), mean)
## [[1]]
## [1] 5.5
## 
## [[2]]
## [1] 15.5
sapply(list(1:10, 11:20), mean)
## [1]  5.5 15.5
# 'simplify = FALSE' em 'sapply()' eh equivalente a 'lapply()'
sapply(list(1:10, 11:20), mean, simplify = FALSE)
## [[1]]
## [1] 5.5
## 
## [[2]]
## [1] 15.5

Função mapply

Uma forma multivariada da função apply, é a função mapply(), com sintaxe:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
       USE.NAMES = TRUE)

em que:

  • FUN argumentos que recebe a função desejada;
  • ... argumentos para vetorização;
  • MoreArgs uma lista com argumentos adicionais a FUN;
  • SIMPLIFY, argumento lógico, se TRUE retorna o resultado de forma simplificada, sendo um vetor atoômico, matriz ou array; se FALSE o retorno é uma lista;
  • USE.NAMES, argumento lógico; se TRUE é retornado o nome inserido nos objetos da lista; se FALSE, caso contrário.

Exemplo

mapply(FUN = mean, list(x = 1:10, y = 11:20), USE.NAMES = TRUE)
##    x    y 
##  5.5 15.5
mapply(FUN = mean, list(x = 1:10, y = 11:20), USE.NAMES = FALSE)
## [1]  5.5 15.5
mapply(FUN = rep, x = 1:4,  times = 1:4)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2 2
## 
## [[3]]
## [1] 3 3 3
## 
## [[4]]
## [1] 4 4 4 4

Exemplo

mapply(FUN = rep, x = 1:4,  times = 4)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    1    2    3    4
## [3,]    1    2    3    4
## [4,]    1    2    3    4
mapply(rep, times = 1:4, MoreArgs = list(x = 4))
## [[1]]
## [1] 4
## 
## [[2]]
## [1] 4 4
## 
## [[3]]
## [1] 4 4 4
## 
## [[4]]
## [1] 4 4 4 4

Exemplo: mapply() ao invés de Vectorize()

mapply(rnorm, n = 10, mean = 1:5)
##             [,1]     [,2]     [,3]     [,4]     [,5]
##  [1,]  1.6840250 1.603524 2.253422 2.387731 3.507960
##  [2,] -0.7187352 2.472191 3.015020 2.910106 5.751541
##  [3,]  1.8816319 1.493832 4.125269 3.206542 5.556132
##  [4,]  1.4697640 2.581277 1.449843 2.669233 6.814892
##  [5,]  1.0510231 2.683744 1.864846 4.437031 6.356493
##  [6,]  2.1710382 1.104355 2.333788 3.646010 5.196103
##  [7,]  0.8368339 1.432737 2.927544 6.703752 4.432431
##  [8,]  0.9890865 0.639900 4.098812 3.388542 6.112436
##  [9,]  0.1364386 1.915704 1.095787 4.678287 5.348190
## [10,] -0.6050549 1.305821 1.860704 6.127836 4.421345

Bons estudos!