Tratando Duplicidades no SAS

É comum encontrar campos duplicados em uma tabela. Seja porque algum join ou agrupamento que poderia ter sido melhor realizado (mesmo não trazendo informações erradas), por causa de algum erro de inserção da informação ou qualquer outra coisa. No SAS, há algumas maneiras práticas de tratar esse erro. Aqui você vai aprender a ordenar sua tabela com PROC SORT, exluir duplicidades com NODUPKEY, gerar uma tabela com os valores que estavam duplicados utilizando DUPOUT e excluir duplicidades por todos os campos com BY _ALL_.

Você pode excluir informações repetidas utilizando o proc sort combinado com o nodupkey. Para quem não conhece, proc sort serve para ordenar as variáveis de sua tabela. Utilizando o nodupkey, você vai ordenar mantendo apenas a primeira linha em que aparece a informação duplicada. Vamos observar a tabela cadastro onde temos o código de identificação dos clientes, uma marcação indicando se ele é um cliente VIP, uma coluna com o CEP cadastrado e a data de cadastramento do CEP:

Primeiro, vamos ordenar de forma decrescente a data de cadastro, mantendo clientes cadastrados mais recentemente no topo:

*ORDENA TABELA;
proc sort data =cadastro; 
    by cliente descending data_cadastro; 
run;

O resultado é esse:

Agora, podemos tirar a duplicidade do campo cliente. Ou seja, vamos manter apenas a primeira linha que aparece contendo o cadastro de cada cliente. A saída será a tabela cadastro_sem_dup:

*TIRA DUPLICIDADE POR CLIENTE;
proc sort data =cadastro out= cadastro_sem_dup nodupkey; 
    by cliente; 
run;

Veja que precisamos incluir o nome da tabela de saída após o out, caso contrário perderíamos nossa tabela original. E precisamos também incluir o nodupkey, que faz o justamente o que queremos, excluir duplicidades.

Agora, vamos supor que a tabela tenha outras colunas que, caso não tenham repetições, você as mantenha. Por exemplo, suponha que você queira guardar os itens duplicados para análises futuras. Para isso, basta você enviar os valores duplicados para outra tabela utilizando o dupout:

*GUARDA VALORES DUPLICADOS;
proc sort data =cadastro out= cadastro_sem_dup 
    dupout= valores_dup nodupkey; 
    by cliente; 
run;

Agora, vamos supor que você possui uma tabela diferente, com várias linhas inteiramente duplicadas:

E você queira tirar duplicidade por todas as colunas (não apenas a primeira como em nossos primeiros exemplos), você apenas precisa especificar ao SAS que você quer tirar a duplicidade por todas as colunas com o _all_:

*EXCLUIR DUPLICIDADES POR TODAS COLUNAS;
proc sort data =tabela_exemplo out= tabela_exemplo_sem_dup nodupkey; 
    by _all_; 
run;

Uma última análise interessante que você pode fazer com seus dados é verificar quais valores aparecem duplicados e quais são únicos. Vejamos uma outra tabela de cadastro:

proc sort
     data = cadastro;
     by cliente;
run;

data tabela_var_unica tabela_var_dup;
     set cadastro;
     by cliente;
     if first.cliente and last.cliente
          then output tabela_var_unica;
     else output tabela_var_dup;
run;
Basicamente o código verifica se a primeira vez que o cliente aparece é também a última, se for, este cliente faz parte da saída tabela_var_unica, caso contrário, faz parte da saída tabela_var_dup. Veja que para utilizar o first e o last, seus dados precisam estar ordenados. Essa mesma expressão estava no post Contador e função oposta ao lag no SAS, recomendo você dar uma lida e se acostumar, é muito útil!
Gostou do conteúdo? Se inscreva para receber as novidades! Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e compartilhar com seus amigos. De verdade, isso faz toda a diferença. Você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @EstatSite ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal do Yukio.
Bons estudos!

 

3 comentários em “Tratando Duplicidades no SAS”

Deixe um comentário

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