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!