R apply(), lapply(), sapply(), tapply() com exemplos
โก Resumo Inteligente
As funรงรตes apply(), lapply(), sapply() e tapply() formam a famรญlia apply do R, uma alternativa vetorizada aos loops explรญcitos que aplica uma funรงรฃo escolhida em matrizes, listas, vetores e dados agrupados para retornar resultados concisos.

Este tutorial tem como objetivo apresentar a coleรงรฃo de funรงรตes apply(). A funรงรฃo apply() รฉ a mais bรกsica de todas as coleรงรตes. Tambรฉm aprenderemos sapply(), lapply() e tapply(). A coleรงรฃo apply pode ser vista como um substituto do loop.
A coleรงรฃo apply() vem junto com รฉ essencial pacote se vocรช instale R com Anaconda. A funรงรฃo apply in R pode ser alimentada com muitas funรงรตes para realizar aplicaรงรตes redundantes em uma coleรงรฃo de objetos (quadro de dados, lista, vetor, etc.). O objetivo de apply() รฉ principalmente evitar usos explรญcitos de construรงรตes de loop. Eles podem ser usados โโpara uma lista de entrada, matriz ou array e aplicar uma funรงรฃo. Qualquer funรงรฃo pode ser passada para apply().
funรงรฃo aplicar()
Aplique() pega o quadro de dados ou matriz como entrada e fornece a saรญda em vetor, lista ou array. Aplicar funรงรฃo em R รฉ usado principalmente para evitar usos explรญcitos de construรงรตes de loop. ร a mais bรกsica de todas as coleรงรตes que podem ser usadas em matrizes.
Esta funรงรฃo leva 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>
O exemplo mais simples รฉ somar uma matriz sobre todas as colunas. O cรณdigo apply(m1, 2, sum) aplicarรก a funรงรฃo sum ร matriz 5ร6 e retornarรก a soma de cada coluna acessรญvel no conjunto de dados.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Saรญda:

Melhor prรกtica: Armazene os valores antes de imprimi-los no console.
funรงรฃo lapply()
lapidar() A funรงรฃo รฉ รบtil para realizar operaรงรตes em objetos de lista e retorna um objeto de lista com o mesmo comprimento do conjunto original. lappy() retorna uma lista de comprimento semelhante ao objeto de lista de entrada, cada elemento do qual รฉ o resultado da aplicaรงรฃo de FUN ao elemento correspondente da lista. Lapply em R pega lista, vetor ou quadro de dados como entrada e fornece saรญda em lista.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l em lapply() significa lista. A diferenรงa entre lapply() e apply() estรก entre o retorno da saรญda. A saรญda de lapply() รฉ uma lista. lapply() pode ser usado para outros objetos, como quadros de dados e listas.
A funรงรฃo lapply() nรฃo precisa de MARGIN.
Um exemplo muito fรกcil pode ser alterar o valor da string de uma matriz para minรบsculas com a funรงรฃo tolower. Construรญmos uma matriz com os nomes dos filmes famosos. O nome estรก em formato maiรบsculo.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Saรญda:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Podemos usar unlist() para converter a lista em um vetor.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Saรญda:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
funรงรฃo saply()
aplicar() funรงรฃo recebe lista, vetor ou quadro de dados como entrada e fornece saรญda em vetor ou matriz. ร รบtil para operaรงรตes em objetos de lista e retorna um objeto de lista com o mesmo comprimento do conjunto original. A funรงรฃo Sapply em R faz o mesmo trabalho que a funรงรฃo lapply(), mas retorna um vetor.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Podemos medir a velocidade mรญnima e parar.ping Distรขncias dos carros no conjunto de dados de carros.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Saรญda:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Saรญda:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Saรญda:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Saรญda:
## speed dist ## 25 120
Podemos usar uma funรงรฃo integrada do usuรกrio em lapply() ou sapply(). Criamos uma funรงรฃo chamada avg para calcular a mรฉdia do mรญnimo e do mรกximo do vetor.
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
saรญda
## speed dist ## 14.5 61.0
Sapply em R รฉ mais eficiente que lapply() na saรญda retornada porque sapply() armazena valores diretamente em um vetor. No prรณximo exemplo, veremos que nem sempre รฉ esse o caso.
Podemos resumir a diferenรงa entre apply(), sapply() e `lapply() na tabela a seguir:
| funรงรฃo | Argumentos | Objetivo | Entrada | saรญda |
|---|---|---|---|---|
| Aplique | aplicar(x, MARGEM, DIVERSรO) | Aplicar uma funรงรฃo ร s linhas ou colunas ou a ambas | Quadro de dados ou matriz | vetor, lista, matriz |
| lapidar | lapplicar (X, DIVERTIDO) | Aplicar uma funรงรฃo a todos os elementos da entrada | Lista, vetor ou quadro de dados | Lista |
| vivamente | aplicar (X, DIVERTIDO) | Aplicar uma funรงรฃo a todos os elementos da entrada | Lista, vetor ou quadro de dados | vetor ou matriz |
Vetor de fatia
Podemos usar lapply() ou sapply() intercambiรกveis โโpara fatiar um quadro de dados. Criamos uma funรงรฃo, Below_average(), que pega um vetor de valores numรฉricos e retorna um vetor que contรฉm apenas os valores que estรฃo estritamente acima da mรฉdia. Comparamos ambos os resultados com a funรงรฃo 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)
Saรญda:
## [1] TRUE
funรงรฃo taply()
tocar() calcula uma medida (mรฉdia, mediana, mรญnimo, mรกximo, etc.) ou uma funรงรฃo para cada variรกvel de fator em um vetor. ร uma funรงรฃo muito รบtil que permite criar um subconjunto de um vetor e depois aplicar algumas funรงรตes a cada subconjunto.
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 do trabalho de um cientista de dados ou pesquisador รฉ calcular resumos de variรกveis. Por exemplo, meรงa a mรฉdia ou agrupe os dados com base em uma caracterรญstica. A maioria dos dados รฉ agrupada por ID, cidade, paรญses e assim por diante. Resumir o grupo revela padrรตes mais interessantes.
Para entender como funciona, vamos usar o conjunto de dados iris. Este conjunto de dados รฉ muito famoso no mundo do aprendizado de mรกquina. O objetivo deste conjunto de dados รฉ prever a classe de cada uma das trรชs espรฉcies de flores: Sรฉpala, Versicolor, Virginica. O conjunto de dados coleta informaรงรตes para cada espรฉcie sobre seu comprimento e largura.
Como trabalho anterior, podemos calcular a mediana do comprimento para cada espรฉcie. Tapply em R รฉ uma maneira rรกpida de realizar esse cรกlculo.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Saรญda:
## setosa versicolor virginica ## 3.4 2.8 3.0
