SAS

Trucos SAS. Borrando blancos innecesarios con COMPBL

Me ha llegado hoy una duda interesante. El problema era eliminar espacios en blanco innecesarios mediante alguna función de SAS. Más concretamente teníamos algo parecido a:

data prueba;

nombre="DE PEDRO                     MARTINEZ                ESTEBAN JOSE";

/*QUEREMOS LLEGAR A: DE PEDRO MARTINEZ ESTEBAN JOSE*/

run;

Pues bien, esto se puede hacer con la función COMPBL que “ remove blank spaces with SAS ”:

data prueba;

nombre="DE PEDRO                 MARTINEZ             ESTEBAN JOSE";

nombre2=compbl(nombre);

put nombre2;

run;

Una función fácil y práctica que seguro conocéis pero que no está mal recordar. Saludos.

Curso de lenguaje SAS con WPS. Funciones en WPS

A la hora de trabajar con variables en WPS uno de los elementos fundamentales son las funciones. En WPS son completamente análogas a SAS. Además este capítulo quiero que nos sirva para familiarizarnos un poco más con el interfaz de WPS y con los elementos de WPS. Vamos a crear un script , un programa SAS, dentro de nuestro proyecto. Nos ubicamos en el Proyect Explorer pulsamos el botón derecho y New — Other en la ventana que nos sale nos vamos a WPS y generamos un nuevo programa (script) al que damos el nombre de funciones:

Agregador de noticias de SAS

Tall Galili administrador de R-bloggers ha creado un agregador de noticias de SAS. Ya estás tardando en suscribirte. Por cierto, un título increible: An online (unofficial) SAS® journal – written by bloggers tratándose de SAS la palabra unofficial tenía que aparecer. Por cierto, R-bloggers también agrega blogs en español y otras lenguas.

Macros (fáciles) de SAS. Número de obsevaciones de un dataset

Con esta macro podréis identificar el número de observaciones de UN CONJUNTO DE DATOS SAS. No funciona con tablas Oracle, Informix, DB2,… me gustaría dejarlo claro. Al emplear la función deI/O OPEN junto con ATTRN y CLOSE no realizamos un conteo de observaciones. Al final el proceso crea una macro variable que se llama NOBS y que podremos usar en nuestra sesión SAS.

%macro observaciones(datos);

/*EL NUMERO DE OBS LO VAMOS A METER EN UNA MV GLOBAL*/

%global nobs;

/*ABRIMOS EL CONJUNTO DE DATOS PARA VER SUS CARACTERISTICAS*/

%let datosid = %sysfunc(open(&datos));

/*SI ESTA ABIERTO ENTONCES LA FUNCION ATTRN NOS DA LA NOBS*/

%if &datosid %then %do;

%let nobs =%sysfunc(attrn(&datosid,NOBS));

/*CERRAMOS EL CONJUNTO DE DATOS*/

%let rc = %sysfunc(close(&datosid));%end;

%mend ;

Fácil y rápida. Si alguien tiene problemas con su uso que lo comunique en el blog. Seguro que es de gran utilidad. Saludos.

La importancia del parámetro HASHEXP

La última entrada (de momento) sobre objetos HASH en SAS. Quiero analizar la importancia que tiene el parámetro hashexp a la hora de crear el objeto hash cuando deseamos ordenar un conjunto de datos. Para ello he realizado un experimento con SAS cuyo código podéis descargaros .aquí. Es un código de calidad muy baja pero que da como resultado el siguiente gráfico:

ejecuciones-hashexp-distintas.png

Se trata de un experimento en el que ordenamos un dataset con 7 variables y diferentes tamaños, se miden los tiempos de ordenación para exponentes 2, 5, 10 y 20. Se realizan 2 réplicas del experimento para evitar algún problema con el equipo (deberían hacerse más pero tarda mucho) y el resultado de la combinación entre tamaño-exponente nos da como resultado un tiempo de ejecución que graficamos. En el eje y del gráfico tenemos los tiempos de ejecución y en el eje x el tamaño en miles del dataset ordenado. Para cada combinación exponente-tamaño se han realizado dos ordenaciones y se han medido los tiempos. El resultado obtenido, como cabía esperar, indica que el exponente, el parámetro hashexp , tiene mucha importancia a la hora de realizar ordenaciones mediante objetos hash con SAS. En nuestro experimiento las diferencias las encontramos a partir de los 2 millones de registros y se van incrementando en función del tamaño del dataset, sin embargo en la última ejecución las diferencias parecen reducirse. Las líneas 2, 5 y 10 obtienen resultados muy similares siendo el exponente 20 el que mejores resultados ofrece.

Laboratorio de código SAS. Ordenaciones con HASH vs. PROC SORT

Hace pocas fechas vimos el código SAS empleado para la realización de ordenaciones de conjuntos de datos SAS mediante algoritmos de hash. Ya os comuniqué que era una forma más eficiente y hoy quería demostraros tal eficiencia con un laboratorio de código SAS. La situación es la siguiente, creamos un dataset con 1.000.000 de registros, 13 variables y comparamos un PROC SORT con una ordenación mediante hash, medimos tiempos y podemos determinar qué forma de ordenación es más eficiente.

Objetos hash para ordenar tablas SAS

A partir de la versión 9.1 de SAS se incluyeron los objetos HASH. Hace tiempo ya demostramos su eficiencia en el cruce de tablas y hoy quería mostraros como se programa una ordenación empleando HASH. La verdad es que estoy saboreando mis últimos días con SAS v9.2, en breve volveré a una versión muy anterior. El codigo, en mi opinión, es muy sencillo y como es habitual tenemos ejemplo ilustrativo que comentaré a continuación:

Abreviar código en Enterprise Guide

En Enterprise Guide de SAS podemos ahorrarnos código empleando las abreviaturas del editor. Yo no lo recomiento porque nuestros códigos sólo podrán ser ejecutados con nuestros equipos pero Guide es una herramienta pensada para los usuarios y no para el desarrollo de código. Sobre un programa de Guide pulsamos sobre programas-> Añadir Abreviaturas y aparece la siguiente ventana:abreviatura_enterprise_guide.PNGEn la ilustración que os pongo hemos creado la abreviatura ps que equivale a proc sql. Con ello cada vez que en el editor de programas de Guide pongamos ps veremos lo siguiente:abreviatura_enterprise_guide-2.PNGEl editor entiene que estamos escribiendo proc sql y pulsando el TAB podemos ahorrarnos escribir mucho mucho código.

Trucos SAS. Ejecutar un código si existe una tabla o un fichero

Esta duda me llegó hace unos días. Se trataba de ejecutar un código si existía determinado fichero o determinada tabla. Para hacer esto os planteo una posible metodología que yo utilizaba cuando programaba SAS en una gran entidad bancaria con Enterprise Guide 1, por aquellos entonces hacía maravillas con la castaña del Guide v1. Entre ellas unas macros que contenían una sentencia condicional que ejecutaba un código en función de la función (bonita expresión) EXIST o FILEEXIST. Lo que yo hacía era algo parecido a esto:

Macros (fáciles) de SAS. Normaliza un texto rápido

¿Tienes que normalizar un texto con SAS? Llevas 2 horas buscando funciones de texto con la ayuda y te has crispado. En una macro y de forma muy rápida os planteo un muestrario de funciones con las que podéis normalizar (un poco) un texto. Esto es algo que tuve que hacer la otra mañana no es muy sofisticado pero que puede seros de utilidad:

%macro prepara(varib);

&varib.=translate(&varib.,"AEIOU","ÁÉÍÓÚ");

&varib.=tranwrd(&varib.,"NUM","NUMERO");

&varib.=tranwrd(&varib.,"CONT","CONTABLE");

&varib.=tranwrd(&varib.,"IMP ","IMPORTE ");

&varib.=tranwrd(&varib.," POR "," ");

&varib.=tranwrd(&varib.," DE "," ");

&varib.=tranwrd(&varib.," EN "," ");

&varib.=tranwrd(&varib.," LOS "," ");

&varib.=tranwrd(&varib.," AL "," ");

&varib.=tranwrd(&varib.," EL "," ");

&varib.=tranwrd(&varib.," ULTIMOS 12 "," 12 ");

&varib.=tranwrd(&varib.," ULTIMOS 3 "," 3 ");

&varib.=tranwrd(&varib.," ULTIMO MES "," MES ");

&varib.=tranwrd(&varib.," TRANSACCIOENES "," TRANSACCIONES ");

call prxchange(prxparse('s/([A-ZÑa-zñ 0-9]*)([^A-Za-zÑñ 0-9]*)/$1/'),-1,&varib.);

%mend;

En realidad es una sucesión de TRANWRD pero destacaría el uso de la función TRANSLATE para eliminar tildes en nuestras vocales y el uso de CALL PRXCHANGE del que ya tuvimos un aperitivo hace tiempo. Sólo tenéis que copiar y pegar y si tenéis dudas mejor seguid el hilo porque últimamente me están llegando demasiadas por correo y no dispongo de tiempo, algo que ya habréis detectado muchos de los seguidores del blog. De todos modos tengo trucos de estos para seguir dotando de contenido al blog en los próximos meses. Por cierto, si alguien lo mejora que siga el hilo…

Duda de SAS. Longitud de la parte decimal de un número

Una búsqueda que me ha llegado. Longitud de la parte decimal de un número con SAS. Nos sirve para recordar (me gusta insistir en el tema) como transformamos números en caracteres con SAS. La función PUT es la que realiza esta tarea:

data _null_;

y=67.34123432;

x=length(scan(put(y,best32.),2,"."));

put x=;

run;

Transformamos un número a texto. Con SCAN buscamos la parte decimal puesto que el separador será el . Y con LENGTH tenemos la longitud resultante del texto obtenido. No sé para que puede servir esto pero ahí os planteo como se resuelve.

Macros (fáciles) de SAS. Busca duplicados

Una macro muy sencilla que ha aparecido en un programa de funcionalidades y que busca registros duplicados en tablas SAS. Es muy sencilla y a alguien puede serle útil y para eso estamos, para compartir conocimientos aunque sean sencillos. Pocos somos los que compartimos nuestro conocimiento y encima poniendo nuestro dinero, en fin, que me distraigo del tema.

%macro busca_duplicados ( dataset, campo);

proc sql;

create table duplicados (where=(frec>1)) as select

&campo.,

count(*) as frec

from &dataset.

group by 1;

quit;

%mend;

No pongo ni ejemplo de uso, muy fácil. Pero ya verás como alguien le saca partido. Y todo esto de forma altruista, insisto, que si no me valoro yo no me valora nadie. Saludos.