Archivo de la etiqueta: dictionary

Truco SAS. Unir todas las hojas de un Excel en una

Empleamos LIBNAME con SAS para acceder a Excel. Es un truco con limitaciones y que se tiene que ir mejorando a futuro. Se trata de leer todas las hojas de un libro Excel y pegarlas horizontalmente en otra hoja QUE NO DEBE EXISTIR PREVIAMENTE. La macro es la siguiente, no se acompaña de un ejemplo de uso debido a su sencillez:

 %macro une_excel(ubicacion, nombre_union);
libname selec &ubicacion.;

proc sql noprint;
select "SELEC.'"||memname||"'n" into:lista_excel separated by " " 
from dictionary.members 
where libname = "SELEC";
quit;

data SELEC.&nombre_union.;
set &lista_excel.;
run;

libname selec clear;
%mend;

%une_excel("C:\TEMP\unir_excel2\unidos.xlsx", todas);

Creamos una librería SAS a un libro Excel determinado. Leemos con DICTIONARY las hojas que tiene dicho libro y las unimos en una hoja de ese libro al que será la última. Como buena costumbre el desasignamos la librería con LIBNAME CLEAR. Como se ha indicado antes tiene limitaciones, por ejemplo no debe existir la hoja final con la unión. Pero es un buen ejemplo de uso de LIBNAME + EXCEL y DISTIONARY. Saludos.

Macros (fáciles) de SAS. Determinar si existe una variable en un dataset

Duda que me plantearon el otro día. ¿Es posible determinar si existe una variable en un conjunto de datos SAS? Pretendían crear una macro variable que tomara el valor 1 si existía o 0 si no existía. Resolví la duda pero me guardé la macro para ponerla en el blog y así la podéis utilizar todos. De eso se trata, de compartir mis conocimientos con todos de forma altruista por ello prefiero que planteéis las dudas en el blog, no por correo. Así, entre todos, las podemos resolver. En este caso la macro es muy sencilla y tiene pocas líneas:

%macro existe_variable(datos,varib);
%global existe;

%if %index(&datos.,.)>0 %then %do;
%let library=%upcase(%scan("&datos.",1,"."));
%let ds=%upcase(%scan("&datos.",2,"."));
%end; 

%else %do;
%let library=WORK;
%let ds=&datos.;
%end;


proc sql noprint;
select count(*) into: existe
from dictionary.columns
where upcase(libname)="&library." and upcase(memname)="&ds." and
upcase(name)=%upcase("&varib.");
quit;

%mend;;

La macro merece algún comentario. Mediante %scan separamos la librería del dataset. Siempre trabajamos con mayúsculas. Realizamos una consulta a una de las tablas de dictionary de SAS, en concreto a columns. Contamos el número de veces que puede aparecer una variable, como mucho una y es el valor que toma la macro variable existe. Por supuesto acompaño de ejemplo de uso:

data sasuser.uno;
do i=1 to 100;
do j=1 to 10;
output;
end;
end;
run;
**********************;
%existe_variable(sasuser.uno,j);
**********************;
data uno;
set sasuser.uno;
if &existe. then do;
drop j;
end;
run;

La verdad es que una vez realizado el proceso no le encuentro mucha utilidad pero ahí le tenéis por si le necesitáis en alguna ocasión. Saludos.

Trucos SAS. Unión de múltiples tablas SAS con un nombre parecido

Ha llegado una búsqueda y ponemos el truco. Creo que ya lo puse pero no está mal de recordarlo.

1. Creamos 20 datasets aleatorios con 10 observaciones cada uno:
%macro doit;
%do i=1 %to 20;
data zzdatos_&i.;
do i=1 to 10;
output;
end;
run;
%end;
%mend;

Un bucle fácil de macros ha generado 20 dataset que se llaman ZZDATOS_n. Recomiendo siempre emplear nombres "absurdos" para el trabajo con esta metodología. Sigue leyendo Trucos SAS. Unión de múltiples tablas SAS con un nombre parecido