6.1 Funções da família apply()
Algumas funções da família apply()
são muito úteis na manipulação de dados e descrição de dados.
Essas funções são muito poderosas, porque permitem você fazer iterações de forma simples, ou seja, você pode aplicar uma função a vários objetos simultaneamente com funções dessa família.
O que você faz com essas funções você também faz com as iterações que fazem uso da expressão for(){}
(veja seção 6.3), mas essas funções simplificam e aceleram o processo.
6.1.1 Em uma matriz
A função apply()
poderia ser traduzida como:
aplique uma função (FUN) a todas as linhas ou colunas (MARGIN) de uma matriz (X):
?apply # Veja o help
# os argumentos dessa função são:
# X = matrix
# MAGRIN = 1 indica linha, 2 indica colunas
# FUN = a função que você deseja aplicar
# ... ARGUMENTOS DESSA FUNCAO SE FOR O CASO
# TOTAIS MARGINAIS
# crie uma matriz
X <- matrix(1:36, nrow = 4, ncol = 9)
colnames(X) <- paste("col", 1:ncol(X))
rownames(X) <- paste("ln", 1:nrow(X))
head(X) # cabeça da matriz criada
col 1 | col 2 | col 3 | col 4 | col 5 | col 6 | col 7 | col 8 | col 9 | |
---|---|---|---|---|---|---|---|---|---|
ln 1 | 1 | 5 | 9 | 13 | 17 | 21 | 25 | 29 | 33 |
ln 2 | 2 | 6 | 10 | 14 | 18 | 22 | 26 | 30 | 34 |
ln 3 | 3 | 7 | 11 | 15 | 19 | 23 | 27 | 31 | 35 |
ln 4 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 |
## ln 1 ln 2 ln 3 ln 4
## 153 162 171 180
## ln 1 ln 2 ln 3 ln 4
## 33 34 35 36
## ln 1 ln 2 ln 3 ln 4
## 17 18 19 20
## ln 1 ln 2 ln 3 ln 4
## 10.95445 10.95445 10.95445 10.95445
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
## 10 26 42 58 74 90 106 122 138
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
## 4 8 12 16 20 24 28 32 36
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
## 2.5 6.5 10.5 14.5 18.5 22.5 26.5 30.5 34.5
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8
## 1.290994 1.290994 1.290994 1.290994 1.290994 1.290994 1.290994 1.290994
## col 9
## 1.290994
As funções rowSums()
, rowMeans()
, colSums()
, ou colMeans()
são equivalentes à função apply()
.
Elas simplificam o uso para somas (em inglês, sum) e médias (em inglês, mean) de linhas (em inglês, rows) e colunas (em inglês, columns).
Se você conhece bem a função apply()
, você pode fazer o que essas funções fazem e muito mais.
Portanto, ao dominar a função apply()
, você acaba por não precisar se preocupar em aprender essas funções mais específicas.
## ln 1 ln 2 ln 3 ln 4
## 153 162 171 180
## ln 1 ln 2 ln 3 ln 4
## 17 18 19 20
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
## 10 26 42 58 74 90 106 122 138
## col 1 col 2 col 3 col 4 col 5 col 6 col 7 col 8 col 9
## 2.5 6.5 10.5 14.5 18.5 22.5 26.5 30.5 34.5
6.1.2 Em um vetor ou lista
A função lapply()
aplica uma função FUN
para cada elemento de um vetor ou de uma lista, e retorna um objeto de classe list
.
## [1] "A"
## [1] "B"
## [1] "C"
## [1] "D"
## [1] "E"
## [1] "F"
## [1] "G"
## [1] "H"
## [1] "I"
## [1] "J"
## [1] "K"
## [1] "L"
## [1] "M"
## [1] "N"
## [1] "O"
## [1] "P"
## [1] "Q"
## [1] "R"
## [1] "S"
## [1] "T"
## [1] "U"
## [1] "V"
## [1] "W"
## [1] "X"
## [1] "Y"
## [1] "Z"
## [1] "list"
## List of 26
## $ : chr "A"
## $ : chr "B"
## $ : chr "C"
## $ : chr "D"
## $ : chr "E"
## $ : chr "F"
## $ : chr "G"
## $ : chr "H"
## $ : chr "I"
## $ : chr "J"
## $ : chr "K"
## $ : chr "L"
## $ : chr "M"
## $ : chr "N"
## $ : chr "O"
## $ : chr "P"
## $ : chr "Q"
## $ : chr "R"
## $ : chr "S"
## $ : chr "T"
## $ : chr "U"
## $ : chr "V"
## $ : chr "W"
## $ : chr "X"
## $ : chr "Y"
## $ : chr "Z"
## [1] 50
## [1] 30
## [1] 90
## [1] "list"
## [1] 3
# posso usar lapply para calcular a media desses vetores
lapply(ml, mean) # note que retorna uma lista
## [[1]]
## [1] 521.54
##
## [[2]]
## [1] 54.96667
##
## [[3]]
## [1] 1505.378
lt <- lapply(ml, mean) # podemos guardar
lt <- as.vector(lt, mode = "numeric") # e transformar num vetor. MODE neste caso é fundamental usar
lt
## [1] 521.54000 54.96667 1505.37778
6.1.3 Por categoria de um fator
A função tapply()
aplica uma função FUN
em uma coluna numérica individualizando os resultados para cada categoria de um determinado fator.
# calculando o comprimento médio de sepálas pelas categorias de um fator (especies)
class(iris$Sepal.Length) # variavel numerica
## [1] "numeric"
## [1] "factor"
## setosa versicolor virginica
## 5.006 5.936 6.588
## setosa versicolor virginica
## 5.8 7.0 7.9
## $setosa
## [1] 4.3 5.8
##
## $versicolor
## [1] 4.9 7.0
##
## $virginica
## [1] 4.9 7.9
# note que essa funcao sempre retorna um array (que é uma lista de fato, neste caso)
tm <- tapply(iris$Sepal.Length, iris$Species, FUN = min)
class(tm)
## [1] "array"
## [1] "setosa" "versicolor" "virginica"
## [1] 4.3
## [1] "array"
## [1] "setosa" "versicolor" "virginica"
## [1] 4.3 5.8