Este tutorial visa introduzir a colecção de funções apply(). A função apply() é a mais básica de todas as colecções. Também vamos aprender sapply(), lapply() e tapply(). A colecção apply() pode ser vista como um substituto para o laço.
A colecção apply() é agrupada com r pacote essencial se se instalar R com Anaconda. A função apply() pode ser alimentada com muitas funções para realizar uma aplicação redundante numa colecção de objectos (moldura de dados, lista, vector, etc.). O objectivo da função apply() é principalmente evitar utilizações explícitas de construções de laço. Podem ser utilizados para uma lista de entrada, matriz ou matriz e aplicar uma função. Qualquer função pode ser passada para apply().
Neste tutorial, irá aprender
- função
- tapply() function
função função função função função função função função função vector de fatias
apply() function
apply() toma a moldura de dados ou matriz como uma entrada e dá saída em vector, lista ou matriz. apply() A função é utilizada principalmente para evitar utilizações explícitas de construções de laço. É a mais básica de todas as colecções pode ser usada sobre uma matriz.
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 é a soma de uma matriz sobre todas as colunas. O código aplica-se(m1, 2, soma) aplicará a função soma à matriz 5×6 e devolverá a soma de cada coluna acessível no conjunto de dados.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Output:
Best practice: Armazenar os valores antes de os imprimir na consola.
lapply() function
lapply() function é útil para executar operações em objectos de lista e retorna um objecto de lista com o mesmo comprimento do conjunto original. lappy() retorna uma lista com o mesmo comprimento do objecto de lista de entrada, cada elemento do qual é o resultado da aplicação de FUN ao elemento de lista correspondente. lapply() toma lista, vector ou frame de dados como entrada e dá 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() situa-se entre o retorno da saída. A saída de lapply() é uma lista. lapply() pode ser usada para outros objectos como quadros de dados e listas.
função lapply() não necessita 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 o nome dos filmes famosos. O nome está em formato de maiúsculas.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Output:
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
Podemos usar unlist() para converter a lista num vector.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Saída:
## chr "spyderman" "batman" "vertigo" "chinatown"
função sapply()
função sapply() toma lista, vector ou frame de dados como entrada e dá saída em vector ou matriz. É útil para operações em objectos de lista e devolve um objecto de lista com o mesmo comprimento do conjunto original. função sapply() faz o mesmo trabalho que a função lapply() mas devolve um vector.
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 paragem dos carros a partir do conjunto de dados dos carros.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Saída:
## $speed## 4## $dist## 2
smn_cars
Saída:
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Saída:
## $speed## 25## $dist## 120
smxcars
Saída:
## speed dist ## 25 120
Podemos usar uma função incorporada do utilizador em lapply() ou sapply(). Criamos uma função denominada avg para calcular a média do mínimo e máximo do vector.
avg <- function(x) { ( min(x) + max(x) ) / 2}fcars <- sapply(dt, avg)fcars
Saída
## speed dist## 14.5 61.0
função sapply() é mais eficiente do que a função lapply() na saída retornada porque sapply() armazena valores direclty num vector. No exemplo seguinte, veremos que nem sempre é este o caso.
Podemos resumir a diferença entre aplicar(), sapply() e `lapply() na tabela seguinte:
>p>Função | >p>Objectivo | p>Input | p>Output |
---|---|---|---|
aplicar |
p>aplicar(x, MARGIN, FUN) | p>Aplicar uma função às linhas ou colunas ou a ambas | |
p>Aplicar uma função a todos os elementos da entrada | p>Lista, vector ou moldura de dados |
lista |
|
vector ou matriz |
Fatia vector
Podemos usar lapply() ou sapply() intercambiável para fatiar uma moldura de dados. Criamos uma função, abaixo da média(), que toma um vector de valores numéricos e retorna um vector que contém apenas os valores estritamente acima da média. Comparamos ambos os resultados com a função identical().
below_ave <- function(x) { ave <- mean(x) return(x)}dt_s<- sapply(dt, below_ave)dt_l<- lapply(dt, below_ave)identical(dt_s, dt_l)
Output:
## TRUE
função tapply()
tapply() calcula uma medida (média, mediana, min, max, etc.) ou uma função para cada variável de factor num vector. É uma função muito útil que lhe permite criar um subconjunto de um vector e depois aplicar algumas funções a cada um dos subconjuntos.
Parte do trabalho de um cientista ou investigador de dados é calcular resumos de variáveis. Por exemplo, medir a média ou agrupar dados com base numa característica. A maioria dos dados são agrupados por ID, cidade, países, etc. Resumir por grupo revela padrões mais interessantes.
Para compreender como funciona, vamos utilizar o conjunto de dados da íris. Este conjunto de dados é muito famoso no mundo da aprendizagem de máquinas. O objectivo deste conjunto de dados é prever a classe de cada uma das três espécies de flores: Sepal, Versicolor, Virginica. O conjunto de dados recolhe informação para cada espécie sobre o seu comprimento e largura.
Como um trabalho prévio, podemos calcular a mediana do comprimento para cada espécie. tapply() é uma forma rápida de efectuar este cálculo.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Output:
## setosa versicolor virginica ## 3.4 2.8 3.0