Dúvida: remover duplicatas, mas selecionando que linha eliminar

Oi gente, tudo bem?

Queria saber como posso combinar duas funções no R pra analisar bases de dados da Secretaria de Segurança Pública de São Paulo.

Eles divulgam (ativamente no site deles ou via Lei de Acesso à Informação) planilhas com dados de boletins de ocorrência. São dados brutos e as planilhas nunca trazem um BO por linha. Pela metodologia deles, cada linha representa “os dados de uma pessoa, natureza ou objeto relacionado no boletim”. Vou das dois exemplos:

  1. Se eu fizer um BO dizendo que tive DOIS celulares furtados, meu BO vai aparecer em duas linhas diferentes (uma referente a cada celular, a mudança principal vai ser, por exemplo, na coluna “MARCA”).

  2. Se eu registrar um BO de ameaça indicando o autor do crime, esse BO também vai aparecer em duas linhas diferente, uma incluindo meus dados nas colunas “SEXO”, “IDADE”, “DESCR_TIPO_PESSOA” (sendo que eu estarei nessa coluna como “vítima”) e outra com os dados do autor (e nessa coluna ele vai ser identificado como “autor”).

A metodologia da SSP indica que, pra eu remover as duplicatas dos boletins e chegar ao número total de boletins, eu preciso aplicar a função do Excel de remover as duplicatas nas seguintes colunas: “ID_DELEGACIA”, “ANO_BO” e “NUM_BO”. Daí ele remove todas as linhas duplicadas quando achar uma linha onde os valores dessas três colunas sejam iguais a outra linha dessas.

O que eu queria saber como fazer é: consigo usar o R pra fazer essa mesma limpeza, mas escolhendo QUAL linha apagar? No meu caso atual, eu tenho uma planilha de crimes contra pessoas, e eu quero deixar apenas as linhas referentes às VÍTIMAS. Então queria remover as duplicatas seguindo a orientação da SSP, mas deixando as linhas onde a coluna DESCR_TIPO_PESSOA indica o valor “Vítima”.

Alguém saberia como posso fazer essa operação no RStudio?

Obrigada desde já!

3 curtidas

Eu pensei em algo assim:

library(tidyverse)

df <- tribble(
  ~ID_DELEGACIA, ~ANO_BO,  ~NUM_BO, ~DESCR_TIPO_PESSOA,
  "1"          , 2010   ,  1      , "VÍTIMA",
  "1"          , 2010   ,  1      , "OUTRO",
  "2"          , 2010   ,  1      , "VÍTIMA",
  "2"          , 2010   ,  1      , "OUTRO",
  "1"          , 2010   ,  2      , "VÍTIMA",
  "1"          , 2010   ,  2      , "OUTRO",
  "1"          , 2010   ,  3      , "OUTRO",
  "1"          , 2010   ,  3      , "OUTRO",
  "1"          , 2010   ,  4      , "VÍTIMA",
  "1"          , 2010   ,  4      , "VÍTIMA",
)

df
#> # A tibble: 10 x 4
#>    ID_DELEGACIA ANO_BO NUM_BO DESCR_TIPO_PESSOA
#>    <chr>         <dbl>  <dbl> <chr>            
#>  1 1              2010      1 VÍTIMA           
#>  2 1              2010      1 OUTRO            
#>  3 2              2010      1 VÍTIMA           
#>  4 2              2010      1 OUTRO            
#>  5 1              2010      2 VÍTIMA           
#>  6 1              2010      2 OUTRO            
#>  7 1              2010      3 OUTRO            
#>  8 1              2010      3 OUTRO            
#>  9 1              2010      4 VÍTIMA           
#> 10 1              2010      4 VÍTIMA

df %>% 
  group_by(ID_DELEGACIA, ANO_BO, NUM_BO) %>% 
  filter(row_number(desc(DESCR_TIPO_PESSOA == "VÍTIMA")) == 1)
#> # A tibble: 5 x 4
#> # Groups:   ID_DELEGACIA, ANO_BO, NUM_BO [5]
#>   ID_DELEGACIA ANO_BO NUM_BO DESCR_TIPO_PESSOA
#>   <chr>         <dbl>  <dbl> <chr>            
#> 1 1              2010      1 VÍTIMA           
#> 2 2              2010      1 VÍTIMA           
#> 3 1              2010      2 VÍTIMA           
#> 4 1              2010      3 OUTRO            
#> 5 1              2010      4 VÍTIMA

Created on 2020-03-04 by the reprex package (v0.3.0)

Veja que neste caso quando existem duas vítimas com mesmo BO, DELGACIA e ANO, ficaríamos apenas com uma delas, pela ordem que aparece na tabela. Quando para um BO, DELEGACIA e ANO não existem linhas com vítimas, ficaríamos com a primeira categoria que aparece na base também.

Oba!!! Vou testar! Obrigada!

1 curtida

Retornando aqui pra avisar que consegui um código simples que tira as duplicatas das três colunas que a SSP-SP indica usar, e mantém as demais colunas.

Fiz o teste no RStudio e no Excel e deu resultados exatamente iguais =)

df_sem_duplicatas ← df[!duplicated(df[c(“NOME_DELEGACIA”, “ANO_BO”, “NUM_BO”)]),]