Como tratar duplicidades no SAS

É comum termos bases com duplicações, seja por erros ou por características próprias das bases. Se você quiser utilizar uma base sem duplicação no SAS, você deve combinar o comando de ordenação, o proc sort, com algum tipo de lógica. Vejamos um exemplo de uma tabela com duplicidade:

/*Cria tabela exemplo*/
data tabela_exemplo;
     input id $ uf $ dt_cadastro yyyymmdd.;
     cards;
12531 SP 20170102
41456 SP 20180103
12531 SP 20161210
12531 MG 20160515
55564 GO 20180203
97943 PR 20171029
88712 PR 20150722
88712 SP 20140620
;
run;

duplicidade_sas_2

A tabela acima possui uma chave de identificação do cliente, sua respectiva UF e a data de cadastro do cliente. Como há duplicidades, uma opção seria pegar a data de cadastro mais recente. Isso pode ser feito ordenando a tabela pela data de cadastro mais recente e excluindo a duplicidade por id. Isto é, o comando do SAS deve primeiro ordenar a data de cadastro de forma decrescente e em seguida manter apenas a primeira linha por cada id:

/*Ordena a tabela pelas chaves id e dt_cadastro(decrescente)*/
PROC SORT DATA =tabela_exemplo;
BY id descending dt_cadastro;
RUN;

duplicidade_sas_3

Agora que a tabela está ordenada, é possível tirar as duplicidades pela chave id. Isto é, manter apenas a primeira linha em que o respectivo id aparecer e excluir as demais:

/*Tira duplicidade por todas variaveis*/
proc sort data = tabela_exemplo NODUPKEY;
by id;
run;

duplicidade_sas_4

Agora, se você quiser tirar linhas que estejam inteiramente duplicadas, então você deve utilizar um nodupkey combinado com by _all_:

/*cria uma tabela nova sem duplicidade*/
proc sort data =tabela_exemplo;
by _all_;
run;

Você deve ter percebido que em todos os exemplos estamos alterando a tabela. Se você utilizar algum comando errado, a tabela original vai ter seu conteúdo impactado. Sendo assim, seria inteligente criar uma versão 2 como saída do comando:

/*cria uma tabela nova sem duplicidade e mantem a original intacta*/
proc sort data = tabela_exemplo
out = tabela_nova
nodupkey;
by_all_;
run;

Mas e as linhas excluídas? Será que não é necessário para alguma análise futura?

É possível gerar uma tabela de saída com as linhas duplicadas retiradas utilizando o comando dupout (o comando abaixo já partiu da tabela ordenada por id e descending dt_cadastro):

proc sort data =tabela_exemplo nodupkey
    out = tabela_sem_duplicidade
    dupout = duplicidade_excluida;
by id;
run;
duplicidade_sas_5

tabela_sem_duplicidade

duplicidade_sas_6

duplicidade_excluida

Anúncios

1 comentário

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s