sas dataset coalesce

Conjunto de datos múltiples SAS y función Coalesce



dataset (3)

Como respuesta, @Allan Bowe explica que el problema es que las variables que se obtienen para los conjuntos de datos se retienen automáticamente. Entonces podrías agregar código para borrarlos.

data long_data; set data.history20: ; WantedName=COALESCE(WantedName, Wanted_Name); output; call missing(wantedname,wanted_name); run;

O haz una NUEVA variable.

data long_data; set data.history20: ; new_WantedName=COALESCE(WantedName, Wanted_Name); format new_WantedName date9. ; drop WantedName Wanted_Name ; rename new_WantedName = WantedName ; run;

Buen día,

Tengo datos viejos con diferentes formatos y actualizándolos con nuevos. La idea es que la variable WantedName había escrito con guión bajo Wanted_Name mientras que los nuevos datos carecen de esta. No es gran cosa que pensé.

EDITAR: WantedName y Wanted_Name son fechas SAS.

Datos originales:

year Wanted_Name 2013 1234 2013 4321 2013 3241

y desde el año 2015 en adelante:

year WantedName 2015 5678 2015 8765 ....

Intenté la lógica:

%macro macro_env; data _null_; call symput ("curr_year", year(date()) ); run; data long_data; set %do year=2013 %to &curr_year.; data.history&year. %end; ; WantedName=COALESCE(WantedName, Wanted_Name); run; %mend macro_env;

Nop. No funcionó. Por algún motivo, tomó el primer valor de Wanted_Name y lo pegó en todo el rango de datos excepto en los datos nuevos:

year Wanted_Name WantedName 2013 1234 1234 2013 4321 1234 2013 3241 1234 .... 2015 . 5678 2015 . 8765

Ahora logré solucionar el problema eliminando la función coalesce y agregando una declaración de datos adicional:

data long_data; set %do year=2013 %to &curr_year.; data.history&year. %end; ; run; data long_data; set long_data; WantedName=COALESCE(WantedName, Wanted_Name); run;

Pregunta: ¿Qué sucede o por qué no funciona el macro_env original?

Pensé que los conjuntos de datos en el set se cargaron primero y luego se aplicaron las funciones. (Lo cual está funcionando en la última declaración de datos. Aparentemente no ... ¿Tal vez?


Creo que una mejor forma de hacerlo es manejarlo con rename en la declaración set.

data long_data; set %do year=2013 %to &curr_year.; data.history&year. %if &year lt 2015 %then %do; (rename=wanted_name=wantedname) %end; %end; ; run;

Más barato (cambiar el nombre es más barato que la función de coalesce ) y más simple.


La razón es que el pdv retiene implícitamente las variables que se han "establecido" y wantedName no se vacía desde el pdv cuando se cargan los conjuntos de datos anteriores (antes de 2015).

El compilador creó un espacio para ello (leyendo todos los conjuntos de datos en la instrucción set) pero el comando set no reemplaza (inicialmente) el valor de wantedName .

Entonces, cuando se lee la primera observación, falta el nombre wanted_name se aplica el primer valor de wanted_name .

WantedName=COALESCE(., 1234); /* obs 1 */

En la segunda iteración, se ha retenido el valor de wantedname , y así se usa para cada iteración posterior hasta que se lea un conjunto de datos que contenga el nombre wantedname .

WantedName=COALESCE(1234, 4321); /* obs 2 */

El segundo ejemplo usa un conjunto de datos desde el principio que tiene la variable del nombre wantedname .

Gran pregunta!