Inicio > Programming > Proc Sort nodup vs Proc sort Nodupkey

Proc Sort nodup vs Proc sort Nodupkey

Una pregunta que es my frecuente entre usuarios de SAS y especialmente en entrevistas de trabajos es:Cuál es la diferencia entre Proc Sort nodup y Proc Sort nodupkey?

La respuesta esperada sería decir que Nodup (Noduprecs) elimina las observaciones o filas duplicadas comparando todas la variables en el data set mientras que Nodupkey las elimina basada en las variables utilizadas en la sentencia BY.

Lamentablemente debo decirles que esto no es 100% correcto.


Contrariamente a lo que se cree, cuando se usa la opción Nodup SAS no tiene manera de saber sobre estas observaciones o filas duplicadas a menos que éstas, por suerte, se encuentren en secuencia contigua en el data set.

Veamos el siguiente ejemplo de Nodup usando las fechas de las Ligas ganadas por el FC Barcelona, fíjense que el año 1993 esta repetido 2 veces pero no en secuencia contigua:

data Ej_nodup;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
LaLiga Barsa 1993
;
Proc sort nodup data=Ej_nodup ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993
2 LaLiga Barsa 1991
3 LaLiga Barsa 1992
4 LaLiga Barsa 1993

Como podrán haber detallado, la opción nodup no eliminó la observación repetida.

Veamos ahora este ejemplo con las observaciones repetidas en secuencia contigua:

data Ej_nodup;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodup data=Ej_nodup ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993
2 LaLiga Barsa 1991
3 LaLiga Barsa 1992

Ahora sí eliminó la observación duplicada debido a que se encontraban de forma contigua.

Si para el mismo ejemplo utilizamos la opción Nodupkey solo nos quedará una sola observación con la combinación de la sentencia BY

data Ej_nodupkey;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodupkey data=Ej_nodupkey ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993

Agregando la variable yyyy a lista BY estaríamos obteniendo el resultado deseado:

data Ej_nodupkey;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodupkey data=Ej_nodupkey ;
by liga equipo yyyy;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1991
2 LaLiga Barsa 1992
3 LaLiga Barsa 1993

Para finalizar este post, mi recomendación es siempre usar la opción Nodupkey.

SASludos,

Alberto

Advertisement
Categorías:Programming
  1. Aún no hay comentarios.
  1. Aún no hay trackbacks

Deja un comentario

Fill in your details below or click an icon to log in:

Gravatar
Logo de WordPress.com

Please log in to WordPress.com to post a comment to your blog.

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.