Sumifs e Countifs no R

A maioria das pessoas que usa Excel já utilizou as funções sumif() e countif(), em português soma.se() e cont.se(). Estas funções tem como retorno a soma de determinada coluna condicionada a alguma regra qualquer. Imagine, por exemplo, que você é dono de uma loja e queira saber qual foi o gasto total em compras dos clientes acima de 50 anos na sua loja. Mais do que a soma, você pode querer a média ou a contagem do número de clientes. Para entender como se obter isso no R, dê uma olhada na tabela abaixo, composta por uma chave de identificação do cliente (id_cliente), o valor gasto em compras (vlr_compra), a idade e a UF:

Para baixar a tabela -> tabela_exemplo-csv

Vamos supor que você tenha alguma ação focada nas pessoas acima de 50 anos. Calcular a soma da segunda coluna, passa por duas etapas: (1) filtrar os clientes que têm mais de 50 anos; (2) fazer a soma da coluna vlr_compra:

# importa tabela no R
tabela = read.csv("tabela_exemplo.csv", header=T, sep=";")

# filtra clientes com idade maior que 50
filtro_idade = tabela[tabela$idade > 50,]

# soma coluna 2 (vlr_compra)
sum(filtro_idade[,2])

A saída do código acima será 495. Veja que a segunda parte poderia ser escrita com o nome da coluna após o símbolo do cifrão:

# soma coluna 2 (vlr_compra)
sum(filtro_idade$vlr_compra)

Caso você queira outras medidas, como o desvio padrão ou a média:

# desvio padrao coluna 2 (vlr_compra)
sd(filtro_idade$vlr_compra)

# media
mean(filtro_idade$vlr_compra)

E se eu quisesse fazer o countif()? Como eu posso filtrar e contar o número de linhas que a minha tabela possui, dada alguma condição? Neste caso, novamente fazemos um filtro e em seguida fazemos a contagem:

filtro_idade = tabela[tabela$idade > 50,]
nrow(filtro_idade)

Ok, interessante, retornou 4 conforme esperávamos… Mas e se eu quiser saber o número de missings de determinada coluna? Ou se eu quiser fazer uma soma só para quando tivermos o campo id preenchido?

# cria um campo NA
tabela[8,1] = NA
# conta numero de missings da coluna id
sum(is.na(tabela$id_cliente))
# filtra clientes maior q 50 e nao missing
filtro_idade_miss = tabela[tabela$idade > 50 & !is.na(tabela$id_cliente),]

# soma valor de compra se id nao for missing
sum(filtro_idade_miss[,2])

mas e se você quiser fazer tudo isso usando menos linhas? Bem, neste caso, você só precisa juntar as duas linhas de código para cada caso:

# soma o valor de compra para clientes acima de 50 anos

sum( tabela[tabela$idade > 50,][,2])

# conta numero de clientes acima de 50 anos

nrow(tabela[tabela$idade > 50,])

E se você tiver duas condições? Por exemplo, clientes acima de 50 anos e que não são de SP:

filtro_idade_cidade = tabela[tabela$idade > 50 & tabela$uf="SP",]
sum(filtro_idade_cidade[,2])

Agora você já sabe como fazer contagens e somas condicionais. Caso tenha alguma outra dúvida com relação aos filtros em R ou como lidar com missing, há alguns outros posts que podem te auxiliar:

Filtros no R

Formas de deletar linhas com Missing no SAS

Tutorial: Manipulação e Análise de Dados em R

Excluindo linhas missing no R

Se tiver dúvidas, críticas ou sugestões, deixe um comentário. Se quiser escrever por e-mail, o contato está em Sobre o Estatsite. Caso você queira aprender mais sobre os temas relacionados ao blog com dicas mais breves e sucintas, siga o Twitter @EstatSite.

Abraços e bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *