SAS

Truco SAS. Función para contar caracteres

Si deseamos contar cuantas veces aparece un caracter dentro de una cadena en SAS nos encontramos que no existe ninguna función de texto en SAS. Para ello podemos utilizar otras funciones de texto en SAS. La idea es determinar la longitud de la cadena con el caracter en cuestión y restarle la longitud de la cadena sin el caracter. Es decir, ¿cuántas A hay en la frase «Menuda crisis financiera»? Longitud con A y sin espacios= 22, longitud sin A y sin espacios=19, luego 22-19=3 aes. Para este ejemplo no se tienen en cuenta los espacios en blanco, veamos el programa en SAS:

Trucos SAS. Operar con fechas YYYYMM típicas de particiones Oracle

Este truco va orientado a programadores SAS que estén habituados a trabajar con Oracle. El SAS Tip de hoy nos permite parametrizar a la perfección la lectura de tablas históricas particionadas. En estos casos podemos crear parámetros con macrovariables de SAS para leer las tablas Oracle sin necesidad de modificar manualmente las fechas de partición. Un ejemplo:

1. sin parametrizar:

proc sql;

 create table maximo as select

 idcliente,

 max(importe) as importe_semestral

 from ora.tabla

 where f_particion in (200801,200806,200812);

quit;

2. parametrizado:

Truco SAS. Transformaciones de variables con arrays

Hacer ceros los missing en un dataset. Crear una etiqueta «NO DISPONIBLE» en campos carácter sin valores. Cuando trabajamos con SAS es una situación más que habitual. A continuación voy a plantear un par de ejemplos de como podemos usar arrays de variables en SAS para realizar una transformación «masiva» de variables de nuestro conjunto de datos.

Poner missing numéricos a 0:

Lo primero es destacar que no siempre un valor perdido equivale a 0. Cuando realizamos modelos es necesario tener en cuenta que hacemos con los missing, el siguiente ejemplo transforma todos los . de un dataset a 0:

Truco SAS. Macro buscar y reemplazar en texto

A veces hay problemas a la hora de importar un fichero de texto a SAS. Por ejemplo el fichero proviene de Access y tiene los números con formato europeo. El siguiente programa hace un buscar y reemplazar pero con SAS. Partimos de un fichero de texto ubicado en c:\temp\pepin.txt así:

4.497,31 2.776,50
2.555,46 6.782,73
3.752,77 8.791,32
1.599,49 6.903,17
8.584,16 7.050,30
8.061,74 2.605,04
3.666,99 7.319,29
751,63 1.919,96
5.635,12 4.795,78
9.714,18 5.342,31
9.160,85 9.752,27
7.609,17 2.409,43
1.855,36 8.768,07
1.715,74 4.031,63
8.775,23 7.256,52
2.339,50 9.234,67
6.268,95 1.531,50
4.406,24 5.395,50

Truco SAS. Proc contents que genera un dataset

Vamos a introducir los nombres de las variables SAS de un dataset en otro dataset. Esto puede sernos muy útil para realizar documentación, validaciones de los conjuntos de datos generados, automatización de instrucciones,… Es un truco muy sencillo y tan sólo es necesario comprender el funcionamiento del ODS de SAS explicado en otro de los mensajes de este blog. Simplemente empleamos el proc contents de SAS y almacenamos con ODS en un dataset el resultado del listado de las variables:

Importar a SAS desde otras aplicaciones.

Una de las labores más comunes con SAS consiste en leer e importar ficheros provenientes de otras aplicaciones. Es muy habitual trabajar con tablas de Excel, Access, Lotus, Business Object, Microstrategy, SQL Server, SAP… Para ello SAS dispone de algunos módulos que no se disponen en todas las instalaciones debido a que pueden encarecer mucho la instalación final. Por este motivo voy a introduciros en una metodología muy habitual en el trabajo diario: Importación de textos delimitados con SAS.

Truco SAS. Uso de filename y pipe

Hoy presento una de las utilidades de FILENAME para interactuar con los file systems en los que creamos tablas SAS. Consiste en emplear FILENAME con la opción PIPE. Lo que hacemos es asignar una referencia a una ejecución del sistema operativo. Por ejemplo en Windows:

filename dir pipe "dir c:\";data uno;

 infile dir;

 input datos $50.;

run;

Creamos una tabla SAS temporal que contiene el resultado de la ejecución en MS DOS de _dir c:_ muy simple. Pero donde de verdad puede sernos de utilidad el uso de PIPE es en ejecuciones con UNIX. A continuación planteo algunos ejemplos:

El ODS de SAS (III). Documentos HTML y PDF desde SAS

Desde SAS podemos generar PDF y HTML. Esto es muy práctico a la hora de reportar información ya que no necesitaremos pasar por Excel o cualquier otra herramienta de ofimática para generar informes. Además, si generamos HTML podemos crear webs en las que podemos navegar por los resultados obtenidos con SAS. En este mensaje veremos algunos ejemplos prácticos de uso del ODS para conocer mejor su funcionamiento. El primero de ellos crea un informe web a partir de un proc univariate:

Truco SAS. Categorizar variables continuas

Si necesitamos crear grupos a partir de una variable continua podemos emplear una metodología muy sencilla para crear muestras proporcionales o muestras de un tamaño predeterminado a partir de un conjunto de datos SAS. El método de cálculo es bien sencillo. Si deseamos crear N grupos dividimos la observación entre el total y multiplicamos por los N grupos redondeando al entero más alto. Si deseamos grupos de tamaño M dividimos la observación entre M redondeando al entero más alto. En código SAS:

Truco SAS. Observaciones de un dataset en una macro variable

SAS tip sencillo para el uso de las funciones de Input Output de SAS y que puede ahorrarnos más de un paso data. Se trata de una macro que pone el número de observaciones de un dataset en una macrovariable global. Al emplear funciones de I/O su ejecución es inmediata:

*MACRO PARA IDENTIFICAR EL NUMERO DE OBSERVACIONES DE UN DS;

%macro numobs(ds,mv);

*CREAMOS UNA MACRO VARIABLE GLOBAL;

 %global &mv.;	data _null_;

*ABRIMOS EL FICHERO;

 	datossid=open("&ds.");

*OBTENEMOS EL ATRIBUTO NOBS QUE CONTIENE

EL NÚMERO DE OBSERVACIONES;

 	no=attrn(datossid,'nobs');

*ASIGNAMOS EL VALOR A LA MV;

 	call symput ("&mv.",compress(no));

*CERRAMOS EL FICHERO;

 	datossid=close(datossid);

 run;

%mend;

*EJEMPLO DE USO;

data uno;

 do i=1 to 100;

 output;

 end;

run;

%numobs(uno,obs_uno);

%put Observaciones de uno =&obs_uno.;

Como vemos es un código sencillo pero muy práctico ya que nos permite obtener el número de observaciones de forma instantánea. Con él podemos validar procesos, realizar cálculos,…

El ODS de SAS (II). Dataset desde OUTPUT

Ya vimos el funcionamiento de ODS TRACE ON/OFF. Ahora crearemos datasets a partir del OUTPUT que genera un paso PROC de SAS con ODS. Lo principal es conocer como se denomina cada parte del OUTPUT, esto lo conseguimos con TRACE y analizando el LOG. Una vez conocemos la salida empleamos ODS OUTPUT = libreria.dataset. En el ejemplo que teníamos:

_*DATASET ALEATORIO DE 200000 OBSERVACIONES;_  
_data uno;_  
_do i=1 to 20000;_  
_importe=round(rand(«normal»)*1000,.1);_  
_num_productos=min(max(1,rand(«pois»,4)),8);_  
_num_cargos=max(0,rand(«pois»,10)-int(rand(«uniform»)*10));_  
_output ;_  
_end;_  
_run;_

_ods noresults;_  
_ods output Quantiles=cuant;_  
_proc univariate data=uno;_  
_var importe;_  
_quit;_

_ods output Chisq=testchi;_  
_proc freq data=uno;_  
_tables num_productos*num_cargos/chisq;_  
_quit;_  
_ods results;_  

Para evitar la salida en la ventana output o en formato HTML se emplea ODS NORESULTS. Con ODS OUTPUT hemos creado dos datasets. Veamos el log:

El ODS de SAS (I). Elementos del OUTPUT

Hoy comenzaré una serie de mensajes dedicados al ODS (Output Delivery System) de SAS. Este mecanismo de SAS nos permite un uso más eficiente del OUTPUT de nuestros pasos PROC además podemos crear excel (como ya vimos), crear dataset, no generar salidas,… Antes SAS nos ofrecia un texto plano en la ventana OUTPUT, ahora generamos documentos sofisticados. En tres entregas veremos:
*Trazar el OUTPUT de SAS
*Datasets de salidas de SAS
*Documentos con nuestras salidas de SAS:
-HTML
-PDF
Como complemento a estas entregas es posible que redacte un mensaje con algunos ejemplos de uso del PROC TEMPLATE. En esta primera capítulo dedicado al ODS estudiaremos algunas salidas SAS y con ellas, sabremos identificar la estructura del OUTPUT.

Truco SAS. Unir todos los Excel en uno sólo

Este programa SAS une todos los excel que queramos en un único libro.
Cuando estamos haciendo análisis de variables y exportamos los resultados
con ods o con otro método a excel, resulta un poco pesado ir abriendo
cada libro para ver los resultados, a mi me resulta más facil unirmelas todas y tener toda la información contenida en un único Excel.

Espero que os resulte útil!

ods noresults;

ods listing close;

ods html body="c:\temp\retail.xls";

proc print data=sashelp.retail;

run;

ods html close;
ods html body="c:\temp\shoes.xls";

proc print data=sashelp.shoes ;

run;

ods html close;
%macro UNE_EXCEL(in=,out=);

options noxwait;

x erase "&&out";

options xwait;

data _null_;

file "c:\temp\class.vbs";

put 'Set XL = CreateObject("Excel.Application")' /

'XL.Visible=True';

%let n=1;

%let from=%scan(&&in,&&n," ");

%do %while("&&from" ne "");

%let fromwb=%scan(&&from,1,"!");

%let fromws=%scan(&&from,2,"!");

put "XL.Workbooks.Open ""&&fromwb""";

%if &&n=1 %then

put "XL.ActiveWorkbook.SaveAs ""&&out"", -4143"%str(;);

%else %do;

put "XL.Workbooks(""%scan(&&fromwb,-1,'\')"").Sheets(""&&fromws"").Copy ,XL.Workbooks(""%scan(&&out,-1,'\')"").Sheets(%eval(&&n-1))";

put "XL.Workbooks(""%scan(&&fromwb,-1,'\')"").Close";

%end;

%let n=%eval(&&n+1);

%let from=%scan(&&in,&&n, " ");

%end;

put "XL.Workbooks(""%scan(&&out,-1,'\')"").sheets(1).activate";

put "XL.Workbooks(""%scan(&out,-1,'\')"").Save";

put "XL.Quit";

run;

x ‘c:\temp\class.vbs’;
%mend;
%UNE_EXCEL(in= c:\temp\shoes.xls!shoes c:\temp\retail.xls!retail,
out=c:\temp\TodasJuntas.xls);