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:
Formas de deletar linhas com Missing no SAS
Tutorial: Manipulação e Análise de Dados em 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!