Pular para o conteúdo principal

Tutorial sobre a família Apply no R

Neste tutorial, você vai aprender a usar as funções apply no R, suas variações e alguns parentes próximos aplicados a diferentes estruturas de dados.
Atualizado 17 de set. de 2026  · 14 min lido

Explorar com IA

ChatGPTClaudePerplexity

\"learn

\n

Uma observação sobre a família Apply no R

\n

A família Apply no R é um conjunto de funções que permite aplicar uma função aos elementos de um vetor, lista ou matriz. No entanto, é considerada uma funcionalidade legada e não deve ser usada em código novo. Em vez disso, recomenda-se utilizar o pacote purrr para todo o looping em R. O purrr oferece uma sintaxe consistente para trabalhar com funções que recebem múltiplas entradas e saídas, facilitando a escrita e a leitura do código. Além disso, o purrr traz um conjunto de funções otimizadas para ambientes de computação modernos, sendo mais rápido e eficiente do que a família Apply. Em resumo, embora a família Apply ainda possa funcionar em alguns casos, é recomendável usar o purrr em todos os projetos novos em R.

\n

As funções Apply como alternativas a loops

\n

Este post vai mostrar como você pode usar a função R apply(), suas variantes como mapply() e alguns dos parentes de apply(), aplicados a diferentes estruturas de dados. Claro que não dá para cobrir todas as variações, mas, sempre que possível, você vai ver como essas funções podem trabalhar em conjunto, com alguns exemplos um pouco mais robustos.

\n

Também pode ser útil dar uma olhada neste curso de introdução ao R para entender melhor listas, vetores, arrays e data frames, embora você não precise ter concluído o tutorial para acompanhar este post!

\n
\n
\n
\n

A família apply()

\n

A família apply() faz parte do pacote base do R e reúne funções para manipular fatias de dados de matrizes, arrays, listas e data frames de forma repetitiva. Essas funções permitem percorrer os dados de diversas maneiras e evitam o uso explícito de estruturas de loop. Elas atuam sobre uma lista, matriz ou array de entrada e aplicam uma função indicada, com um ou mais argumentos opcionais.

\n

A função chamada pode ser:

\n
    \n
  • Uma função de agregação, como média ou soma (que retornam um número/escalar);
  • \n
  • Outras funções de transformação ou de subsetting; e
  • \n
  • Outras funções vetorizadas, que geram estruturas mais complexas, como listas, vetores, matrizes e arrays.
  • \n
\n

As funções apply() são a base para combinações mais complexas e ajudam a executar operações com pouquíssimas linhas de código. Mais especificamente, a família é composta pelas funções apply(), lapply(), sapply(), vapply(), mapply(), rapply() e tapply().

\n

Mas como e quando usar cada uma?

\n

Isso depende da estrutura dos dados com que você quer trabalhar e do formato de saída de que você precisa.

\n
\n

Como usar apply() no R

\n

Vamos começar com o patriarca da família, o apply(), que opera em arrays. Para simplificar, o tutorial se limita a arrays 2D, também conhecidos como matrizes.

\n

O manual do R base informa que a chamada é a seguinte: apply(X, MARGIN, FUN, ...)

\n

onde:

\n
    \n
  • X é um array ou uma matriz (se a dimensão do array for 2);
  • \n
  • MARGIN define como a função será aplicada: quando MARGIN=1, aplica por linhas; com MARGIN=2, por colunas. Note que, ao usar MARGIN=c(1,2), aplica a linhas e colunas; e
  • \n
  • FUN é a função que você quer aplicar aos dados. Pode ser qualquer função do R, incluindo uma UDF (User Defined Function).
  • \n
\n

Iniciantes podem ter dificuldade para visualizar o que está acontecendo, então uma figura e um pouco de código ajudam a clarear.

\n

Vamos construir uma matriz 5 x 6 e imaginar que você quer somar os valores de cada coluna.

\n

Você pode escrever algo assim:

\n
# Construct a 5 x 6 matrix\nmy_matrix <- matrix(1:30, nrow = 5, ncol = 6)\n\n# Calculate the sum of each column\ncol_sums <- apply(my_matrix, 2, sum)\n\n# Print the result\nprint(col_sums)
\n

A função matrix() cria uma matriz 5 x 6 com valores de 1 a 30. Em seguida, usamos a função apply() para aplicar a função sum() a cada coluna da matriz (2 indica que queremos aplicar por colunas). O vetor resultante com as somas das colunas é armazenado em col_sums e impresso no console.

\n

Lembre que, no R, uma matriz pode ser vista como uma coleção de vetores linha quando você a percorre de cima para baixo (ao longo da dimensão/margem 1) ou como uma lista de vetores coluna quando percorre da esquerda para a direita (dimensão/margem 2).

\n

Isso significa que a instrução que você acabou de executar, ilustrada na figura 1, se traduz em: “aplique a função ‘sum’ à matriz X ao longo da margem 2 (por coluna), somando os valores de cada coluna”.

\n

Note que, para não poluir a figura, apenas uma das colunas está destacada.

\n

Você obtém um vetor linha contendo as somas dos valores de cada coluna.

\n

A saída do código acima, um vetor linha, também seria retornada se você somasse ao longo das linhas da matriz. É assim que o R exibe o resultado.

\n

Uma observação importante: na maioria dos casos, o R consegue retornar um valor mesmo que você não o especifique, ou, mais precisamente, mesmo que o valor de retorno da função não seja atribuído a uma variável. O R simplesmente retorna o último objeto avaliado. Na prática, porém, quando você quer verificar o valor de retorno e/ou precisa fazer outras operações com ele, é melhor atribuir explicitamente os resultados a uma variável.

\n
\n
\n
\n

A função lapply()

\n

Você quer aplicar uma função a cada elemento de uma lista e obter uma lista como resultado. Ao executar ?lapply, verá que a sintaxe lembra a de apply().

\n

A diferença é que:

\n
    \n
  1. Pode ser usada com outros objetos, como data frames, listas ou vetores; e
  2. \n
  3. A saída é uma lista (daí o “l” no nome), com o mesmo número de elementos do objeto de entrada.
  4. \n
\n

Para ver isso na prática, crie algumas matrizes e extraia de cada uma uma determinada coluna.

\n

Essa é uma operação bem comum em dados reais ao fazer comparações ou agregações a partir de diferentes data frames.

\n

Nosso exemplo simples, ilustrado na figura 2, pode ser codificado assim:

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=
\n

\"lapply

\n

A operação é mostrada na parte esquerda da figura 2.

\n

De novo, você começa especificando o objeto de interesse, a lista Mylist. Usa o operador padrão de seleção do R [ e omite o primeiro parâmetro (que vira “qualquer”, por isso aparecem as duas vírgulas).

\n

Em seguida, especifica o segundo parâmetro, que é 2: nossa margem é “coluna”. Assim, você extrai a segunda coluna de todas as matrizes dentro da lista.

\n

Algumas observações sobre o código acima:

\n
    \n
  • A notação [ é o operador de seleção. Lembre, por exemplo, que para extrair todos os elementos da terceira linha de B você usa: B[3,];
  • \n
  • A notação [[ ]] indica que estamos lidando com listas: [[2]] significa o segundo elemento da lista. Isso também aparece na saída exibida pelo R;
  • \n
  • A saída é uma lista com o mesmo número de elementos do objeto de entrada; e
  • \n
  • Note que você também poderia ter extraído um único elemento de cada matriz, assim: lapply(MyList,\"[\", 1, 2)
  • \n
\n

No lado direito da figura 2, você vê uma extração alternativa: agora você omite o primeiro parâmetro e obtém a primeira linha de cada matriz.

\n

Teste você mesmo! Selecione a segunda coluna de cada matriz da lista:

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9
\n
\n
\n

A função sapply()

\n

A função sapply() funciona como a lapply(), mas tenta simplificar a saída para a estrutura de dados mais elementar possível. De fato, sapply() é um “wrapper” para lapply().

\n

Um exemplo ajuda: digamos que você queira repetir a operação de extração de um único elemento como no exemplo anterior, mas agora pegar o primeiro elemento da segunda linha (índices 2 e 1) de cada matriz.

\n

Aplicando lapply(), você teria uma lista; já com sapply(), a menos que passe simplify=FALSE, você obtém um vetor. Veja como funciona no bloco de código abaixo:

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgd mVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PTIpXG50ZXN0X2Z1bmN0aW9uKFwidW5saXN0XCIsIFwieFwiKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkdvb2Qgam9iIVwiKSJ9
\n

Por outro lado, uma função como unlist() pode instruir a lapply() a devolver um vetor!

\n

De qualquer forma, para evitar confusão, é melhor usar essas funções no seu “formato nativo” e evitar conversões, a menos que sejam realmente necessárias.

\n
\n
\n

A função rep()

\n

Algo que costuma ser usado junto com as funções apply() é rep(). Ao aplicá-la a um vetor ou fator x, a função replica seus valores um número especificado de vezes.

\n

Vamos usar um dos vetores que você gerou acima com lapply() em MyList.

\n

Desta vez, porém, você seleciona apenas os elementos da primeira linha e primeira coluna de cada elemento da lista MyList (e usa sapply() para obter um vetor):

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9
\n

Veja que o código acima replica os valores de Z um número de vezes determinado por c(3,1,2): três vezes o primeiro, uma vez o segundo e duas vezes o terceiro.

\n

Prático, né?

\n
\n
\n

A função mapply()

\n

A função mapply() significa “multivariada”. Sua finalidade é vetorizar argumentos para uma função que normalmente não aceita vetores como argumentos.

\n

Resumindo, mapply() aplica uma função a múltiplas listas ou múltiplos vetores como argumentos.

\n

Vamos ver um exemplo de mapply() em que você cria uma matriz 4 x 4 chamando repetidamente a função rep():

\n
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==
\n

Mas perceba que há uma forma mais eficiente de juntar os resultados de rep() do que com c(): ao chamar mapply(), você vetoriza a ação da função rep().

\n
\n\n
\n

A função aggregate()

\n

Essa função está no pacote stats e é usada assim: aggregate(x, by, FUN, ..., simplify = TRUE).

\n

Em outras palavras, funciona de forma parecida com apply(): você especifica o objeto, a função e indica se quer simplificar, como em sapply(). A diferença crítica é a cláusula by, que define a variável ou o campo do data frame pelo qual queremos fazer a agregação.

\n

A próxima seção mostra como isso funciona.

\n
\n
\n

Um exemplo de aggregate()

\n

Considere o conjunto de dados de exemplo Mydf, que contém dados de vendas de um produto e no qual alguns valores da coluna DepPC se repetem.

\n

Essa variável classifica os dados por localização geográfica, como parte de um CEP (aqui os números correspondem aos departamentos da Île-de-France, região que inclui Paris).

\n

Você quer fazer algumas estatísticas nas colunas de vendas. São elas: DProgr, um número progressivo em ordem temporal crescente, e as vendas do produto (a quantidade Qty), além de uma variável lógica, Delivered, que indica se o produto foi entregue (T) ou não (F).

\n

Primeiro, dá para fazer algumas consultas simples para se familiarizar com o conjunto de dados, além de simplesmente exibí-lo digitando o nome (aqui temos 120 registros, mas imagine isso em um arquivo real com milhares de linhas!).

\n

Vamos explorar os dados:

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==
\n

Observação: se quiser ver o número de linhas e colunas do data frame, você também pode chamar nrow(Mydf) e ncol(Mydf).

\n

Muitas outras consultas são possíveis.

\n

Aqui, você quer saber em qual departamento o produto vende melhor, por exemplo. Por isso, deve reagrupar os dados por departamento, somando as vendas Qty para cada departamento DepPC com a ajuda de aggregate():

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9
\n

Assim, aggregate() instrui o R a somar todos os Qty que pertencem ao mesmo departamento.

\n

Note que o R atribuiu a soma a uma variável ‘x’ porque você não definiu outro nome.

\n

A saída é legível, mas com muitos departamentos pode ficar confusa. Nesses casos, vale recorrer a uma visualização: plote os resultados usando um dos sistemas gráficos do R junto com aggregate():

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==
\n

Isso nos dá as vendas por departamento.

\n

Você pode fazer a mesma pergunta apenas para os itens entregues. Para isso, primeiro crie um subconjunto com Delivered = TRUE usando o já familiar operador de subsetting \"[\".

\n

Observação: aqui você atribui o resultado a uma nova variável Y, que é um novo data frame e herda os mesmos nomes de colunas do Mydf. Isso evita repetir a instrução de agregação dentro da chamada de plotagem e melhora a legibilidade:

\n
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=
\n

Assim, você pode formular diferentes perguntas aos dados de forma vetorizada, como com aggregate(), muitas vezes em conjunto com um sistema de visualização prático como o ggplot2. Deu para entender a ideia.

\n

Note que, para chegar a isso, você precisou de pouquíssimas linhas de código.

\n
\n
\n

Vetorização como alternativa a loops e funções Apply?

\n

Você viu algumas variações sobre o mesmo tema: “agir sobre um conjunto estruturado de dados de forma repetitiva”. Nesse sentido, essas funções podem ser vistas não só como alternativa a loops, mas também como uma forma vetorizada de fazer as coisas.

\n

Aqui usamos “vetorizada” num sentido amplo; não vamos entrar no debate sobre se — e quais — funções apply() são de fato vetorizadas (veja, por exemplo, a discussão aqui).

\n

Na prática, para escolher qual função apply() usar, considere:

\n
    \n
  • O tipo de dado de entrada: o objeto sobre o qual você vai atuar (vetor, matriz, array, lista, data frame ou combinação deles)
  • \n
  • O que você pretende fazer: a função FUN que vai passar
  • \n
  • Os subconjuntos desses dados: linhas, colunas ou todos?
  • \n
  • Que tipo de dado você quer receber da função? Você pode querer fazer operações adicionais depois (e você quer um novo objeto ou transformar o objeto de entrada diretamente?).
  • \n
\n

Essas são perguntas gerais que também valem para as funções relacionadas, como aggregate(), by(), sweep() etc.

\n

Mas existem muitas outras! Não pare por aqui. Confira o tutorial Arrays in R da DataCamp.

\n

Como continuação deste tutorial, considere fazer os cursos Introduction to R ou Intermediate R da DataCamp.

\n
\n
Tópicos
R
Ciência de dados

Saiba mais sobre R

Curso

Introdução ao R

4 h
3.1M
Domine os conceitos básicos de análise de dados em R, incluindo vetores, listas e quadros de dados, e pratique o R com conjuntos de dados reais.
Ver detalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

Tutorial

Tutorial de regressão linear no R

Neste tutorial, você aprenderá os fundamentos de um modelo estatístico muito popular: a regressão linear.

Eladio Montero Porras

15 min

Tutorial

Tutorial de Pipes em R para iniciantes

Saiba mais sobre o famoso operador de pipe %>% e outros pipes no R, por que e como você deve usá-los e quais alternativas você pode considerar!
Karlijn Willems's photo

Karlijn Willems

15 min

multiple linear regression

Tutorial

Regressão linear múltipla no R: Tutorial com exemplos

Uma visão geral completa para entender as regressões lineares múltiplas no R por meio de exemplos.
Zoumana Keita 's photo

Zoumana Keita

12 min

Tutorial

Um guia para expressões regulares do R

Explore as expressões regulares no R, por que elas são importantes, as ferramentas e funções para trabalhar com elas, os padrões comuns de regex e como usá-las.
Elena Kosourova's photo

Elena Kosourova

12 min

Tutorial

Introdução a modelos não lineares e percepções usando o R

Descubra as complexidades dos modelos não lineares em comparação com os modelos lineares. Saiba mais sobre suas aplicações, limitações e como ajustá-las usando conjuntos de dados do mundo real.

Somil Asthana

11 min

Tutorial

Funções em Python: como chamar e escrever funções

Descubra como escrever funções em Python reutilizáveis e eficientes. Domine parâmetros, instruções de retorno e temas avançados como funções lambda. Organize melhor seu código com main() e outras boas práticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Ver MaisVer Mais