length ifn datalines data sas datastep

ifn - SAS enviando resultados al conjunto de datos de entrada(el mismo nombre de conjunto de datos entrante y saliente)



retain sas (2)

No pude encontrar información sobre este problema, o no pude especificar la pregunta correctamente.

Déjame hacer la pregunta con código:
Es esta operación

data work.tmp; set work.tmp; * some changes to data here; run;

o especialmente

proc sort data = work.tmp out = work.tmp; by x; run;

peligroso de alguna manera, o se considera una mala práctica en SAS? Tenga en cuenta los mismos nombres de datos de entrada y salida, que es mi punto principal. ¿SAS maneja esta situación correctamente para que no haya resultados ambiguos al ejecutar este tipo de paso / procedimiento de datos?


Algunos ejemplos de por qué esto no se considera una buena práctica. Supongamos que está trabajando de forma interactiva y tiene el siguiente conjunto de datos de código denominado tmp :

data tmp; set sashelp.class; run;

Si tuviera que ejecutar el código siguiente dos veces, correría bien la primera vez, pero en la segunda ejecución recibiría una advertencia ya que la edad variable ya no existe en ese conjunto de datos:

data tmp; set tmp; drop age; run;

En este caso, es un ejemplo bastante inofensivo, y tienes la suerte de que SAS simplemente está dando una advertencia. Dependiendo de lo que estuviese haciendo el paso de datos, podría haber sido algo que generara un error, por ejemplo:

data tmp; set tmp (rename=(age=blah)); run;

O, lo que es peor, puede generar ERROR o ADVERTENCIA y cambiar los resultados esperados, como el siguiente código:

data tmp; set tmp; weight = log(weight); run;

Nuestra intención es aplicar una transformación de registro simple a la variable de ponderación como preparación para el modelado, pero si accidentalmente ejecutamos el paso una segunda vez, estamos calculando el log (log (peso)). No se darán advertencias o errores y mirando el conjunto de datos no será inmediatamente obvio que algo anda mal.

OMI, está mucho mejor creando conjuntos de datos iterativos, es decir. tmp1, tmp2, tmp3, y así sucesivamente ... para cada proceso que actualiza el conjunto de datos de alguna manera. El espacio es mucho más barato que gastar tiempo de depuración.


Este último, clasificándose a sí mismo, se realiza con bastante frecuencia; como ordenar simplemente reorganizar el conjunto de datos, y (a menos que dependas de que el orden sea diferente, o a menos que uses una cláusula where para filtrar el conjunto de datos o cambiar el nombre / mantener / soltar opciones) no causa ningún daño permanente al conjunto de datos, no se considera una mala práctica, siempre que tmp esté en funcionamiento (o un nombre de liba destinado a ser utilizado como directorio de trabajo). SAS crea un archivo temporal para hacer el ordenamiento y, cuando es exitoso, elimina el anterior y cambia el nombre del archivo temporal; sin riesgo sustancial de corrupción.

El primero, establecer un conjunto de datos en un paso de datos, generalmente no se considera una buena práctica. Esto se debe a que un paso de datos a menudo hace algo irreversible, es decir, si lo ejecuta una vez tiene un resultado diferente que si lo ejecuta nuevamente. Por lo tanto, corre el riesgo de no saber qué estado tiene su datastet; y mientras que con el género puede confiar en que lo sabe porque obtiene un error obvio si no está correctamente ordenado la mayor parte del tiempo, con el paso de datos que quizás nunca sepa. Como tal, cada paso de datos generalmente debe producir un nuevo conjunto de datos (al menos, nuevo para ese hilo). Hay momentos en que es necesario hacer esto, o al menos sería un desperdicio sustancial no hacerlo, tal vez una macro que a veces da un paso de datos largos y otras veces no, pero por lo general usted puede programar a su alrededor.

No es peligroso en el sentido de que el sistema de archivos se confundirá; similar a la sort , SAS simplemente creará un archivo temporal, completará el nuevo conjunto de datos, luego eliminará el antiguo y cambiará el nombre del archivo temporal.

(Dejo de lado la mención de cosas como modify que debe establecer un conjunto de datos, ya que tiene una respuesta obvia ...)