R apply(), lapply(), sapply(), tapply() com exemplos
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 as distâncias de parada dos carros a partir do 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