Fernando GamaBlockedUnblockFollowFollowingJan 25Família Apply — Fugindo um pouco dos loops convencionaisNeste tutorial apresentarei de forma objetiva a utilização do grupo de funções da família apply.
Criarei um dataset fictício para que você conheça a utilidade de todas as funções.
A família apply é composta por um conjunto de funções que pertencem nativamente ao R (pacote base).
Neste tutorial apresentarei as seguintes funções:apply() | lapply() | sapply() | tapply() | vapply() | mapply() | rapply()É importante frisar que essas funções não surgiram para substituir os loops convencionais e sim, como uma alternativa adicional para análises mais complexas.
Se você é iniciante na linguagem R ou ainda não conhece a família apply, recomendo que você tente reproduzir tudo que será exposto no tutorial.
Por outro lado, caso tenha um conhecimento mais avançado, este tutorial pode lhe fornecer um guia para recordar algumas funções.
Vamos a prática?Criando o dataset# cadastrando os produtosprodutos <- c(“Macarrão”,”Feijão”,”Batata Frita”,”Bife”,”Leite”, “Farinha”,”Milho”,”Ervilha”,”Salmão”,”Iorgute”, “Cerveja”,”Açúcar”,”Arroz”,”Tomate”, “Alface”, “Melão”,”Banana”,”Queijo”,”Nescau”,”Sorvete”)set.
seed(123)precos <- runif(20, min = 2, max = 10)vendas <- runif(20, min = 20, max = 100)estoque <- sample(c(20:50), size = 20, replace = TRUE) # criação de um datasetdataset_loja <- data.
frame(id_produto = c(1:20), produto = produtos, preco = precos, total_vendas = vendas, total_estoque = estoque)dataset_lojaBasicamente, criamos um banco de dados com informações de vendas de produtos cadastrando informações como nome do produto, preço, total de vendas e quantidade em estoque.
Console:Dataset: no console você terá algo como isto| apply():Descrição: aplica uma função a um vetor ou matriz a partir de uma margem especificada.
# vetor de colunas numéricasapply(X = dataset_loja[,-c(1,2)], MARGIN = 2, FUN = sum)Para calcular a soma total dos preços, total de vendas e estoque basicamente passamos 3 argumentos para função apply.
A coluna desejada que, neste caso, são (preco, total_vendas e total_estoque) e eliminamos as colunas categórica: produto além de id_produto que se comporta como tal — já que não desejamos realizar nenhuma operação matemática nesta coluna.
Depois definimos a margem de 2 — que indica que a operação será realiza na vertical, ou seja, por coluna (caso desejássemos operar sob as linhas setaríamos 1 para margin).
Por último, passamos uma função que será responsável por agregar os resultados de soma para cada coluna.
Console:| lapply():Descrição: similar ao apply, a diferença é que poderá receber uma lista, um vetor ou um dataframe como entrada.
# média das variáveislapply(X = dataset_loja[,-c(1,2)], FUN = mean)A função recebe apenas dois parâmetros obrigatórios.
Primeiro passamos o mesmo dataset do exemplo anterior com a diferença de que agora extraímos a média de cada coluna.
O retorno da função é uma lista, como você pode ver abaixo.
Console:| sapply():Descrição: similar ao lapply, com a diferença que apresenta o resultado em um formato mais amigável.
# mediana de cada variávelsapply(dataset_loja[,-c(1,2)], median)Novamente repito as colunas selecionadas, mas desta vez, extraio a mediana para cada coluna.
Console:| tapply():Descrição: aplica uma função a um subconjunto de um vetor que é construído a partir de um outro vetor (normalmente, um fator).
Para ilustrar melhor esta função, adicionaremos uma variável chamada fornecedor e acoplaremos ao nosso dataset.
set.
seed(123)# cadastro de fornecedorfornecedores <- sample(c(“Fornecedor A”,”Fornecedor B”,”Fornecedor C”, “Fornecedor D”), size = 20, replace = TRUE)# novo datasetdataset_loja <- data.
frame(cbind(dataset_loja), fornecedor = fornecedores)Agora eu aplico a função tapply para descobrir a média de preço de vendas para cada fornecedor:# média de preço praticado para cada fornecedortapply(dataset_loja[,c(“preco”)], dataset_loja[,ncol(dataset_loja)], mean)Basicamente a função agrupa os fornecedores e aplica uma função a cada grupo de fornecedores.
Essa função é a média —medida que escolhemos para extrair dentre todos os produtos vendidos, o preço médio cobrado por cada fornecedor.
A saída é apresentada abaixo:Console:| vapply():Descrição: similar ao sapply, porém tem um tipo de valor de retorno pré-estabelecido.
# obter o resumo estatístico das variáveisvapply(dataset_loja[,-c(1,2,ncol(dataset_loja))], FUN = fivenum, FUN.
VALUE = c(Min.
= 0, “1stQu.
” = 0, Media = 0, “3rd Qu.
” = 0, Max = 0))# se desejar comparar descomente e execute o comando abaixo# summary(dataset_loja[,-c(1,2,ncol(dataset_loja))])Utilizamos a função fivenum para retornar o resumo estatístico das variáveis numéricas do dataset_loja.
É similar a função summary().
Entretanto, atrelado ao vapply temos um maior controle em nosso output que terá, portanto, um formato de saída diferente.
Console:| mapply():Descrição: uma função passada como argumento é aplicada aos primeiros elementos de cada argumento de forma sequencial.
É uma versão multivariada do sapply.
# multiplicando o preço pelo total em estoque e depois somando com a quantidade vendasmapply(FUN = function(x,y,z){(x*y)+z}, dataset_loja[,c(“preco”)], dataset_loja[,c(“total_estoque”)], dataset_loja[,c(“total_vendas”)])Note que agora existe uma diferença sutil: primeiro você passa uma função e em seguida os parâmetros.
Dessa vez, criamos uma função anônima que multiplicará o preço do produto pelo total em estoque e depois somamos com total de vendas.
Console:| rapply():Descrição: aplica uma função a uma lista de forma recursiva.
# estrutura do datasetstr(dataset_loja)Console:Antes de aplicar o rapply, extraímos a estrutura do nosso dataset.
Novamente, analisaremos as variáveis — preco, total_vendas e total_estoque.
Conforme o console acima, as duas primeiras são do tipo numeric, enquanto que a última é do tipo int.
Tendo isso em mente, executaremos o comando abaixo:# aplicando a função a apenas um conjunto de variáveisrapply(dataset_loja[,-c(1,2, ncol(dataset_loja))], mean, classes = “numeric”)Você percebe a similaridade com o lapply?.O resultado seria o mesmo se repetíssemos os mesmos argumentos passados para o lapply.
Por isso, para trazer algo diferente, utilizei o argumento classes = “numeric” a fim de restringir a aplicação da média a um conjunto de variáveis do tipo numeric.
Dessa forma, teremos como resultado a média das variáveis com tipagem numérica — preço e total_vendas.
Console:ConclusãoEspero que você tenha aproveitado mais este tutorial.
Acredito que o que fica é a sensação da grande capacidade de aplicação dessas funções em nossos projetos.
E, de fato, posso afirmar que sim!.Muitos dos nossos scripts podem vir carregados de loops e condicionais.
Uma alternativa é tentar explorar essas funções afim de minimizar quantidade de código e melhorar sua legibilidade.
.