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
Leer más...