Truco SAS. Identificar el proceso en Unix con SYSJOBID

Un truco SAS muy rápido y que a algún compañero le ha venido muy bien y por eso lo pongo. La macrovariable &SYSJOBID nos identifica el job de UNIX que está corriendo en ese momento. Es una macro del sistema y se halla en el diccionario de macros de SAS. Tenemos una vista en SASHELP.VMACRO de cuáles son estas macros AUTOMATIC. Curiosead SASHELP, tiene algunas vistas muy interesantes; creo que ya he comentado algo sobre ellas. ...

26 de agosto de 2009 · rvaquerizo

Trucos SAS. Eliminar etiquetas en los conjunto de datos SAS

Hoy planteo un ejemplo de uso de las vistas de SASHELP con los nombres de las columnas de una tabla SAS. Además, sirve para conocer mejor el PROC DATASETS y la creación de macrovariables con el PROC SQL. Una macro que no es de mucha utilidad, pero con la que podemos empezar a aproximarnos al lenguaje macro de SAS: %macro sinetiquetas(conj); data _null_; if index("&conj.", ".") = 0 then x = "WORK"; else x = scan("&conj.", 1, "."); call symput('libreria', upcase(x)); if index("&conj.", ".") = 0 then y = "&conj."; else y = scan("&conj.", 2, "."); call symput('tabla', upcase(y)); run; proc sql noprint; select compress(name || "=''") into :l1 separated by " " from sashelp.vcolumn where libname = "&libreria." and memname = "&tabla."; quit; proc datasets lib=&libreria. nolist; modify &tabla.; label &l1.; run; quit; %mend; Primero buscamos con un paso DATA si es una tabla temporal o permanente. Creamos una macrovariable con los nombres de las variables preparadas para eliminar etiquetas (var1=''). Las etiquetas las quitamos con DATASETS y MODIFY. La macro sólo necesita como parámetro la tabla sobre la que deseamos eliminar las etiquetas. A pesar de ser un truco fácil, seguro que más de uno se precompila esta macro en sus sesiones SAS. Saludos.

17 de agosto de 2009 · rvaquerizo

Equivalencias entre PROC SQL y DATA en las uniones de tablas SAS

Muchos de los que llegan a programar con SAS son grandes expertos en SQL. Cuando dominas perfectamente un lenguaje, es difícil acostumbrarse a otro. Por ello, quiero plantear un artículo que estudie los tipos de uniones mediante pasos DATA y su análogo con el PROC SQL. Con ello espero que los profesionales que manejan el lenguaje SQL entiendan mejor el paso DATA. En mi línea habitual, creo dos datasets y manejo ejemplos. ...

12 de agosto de 2009 · rvaquerizo

En MERGE, ¿mejor IF o WHERE?

Cuando programo en SAS algún paso DATA como unión con MERGE, a modo de filtro empleo habitualmente IF en vez de WHERE. ¿El motivo? Mejor lo vemos con ejemplos. Voy a generar dos datasets aleatorios de dos millones de registros cada uno. Tendrán un campo autonumérico y un campo aleatorio que toma valores entre 0 y 1: options fullstimer; data uno; do i = 1 to 2000000; aleatorio1 = ranuni(9); output; end; run; data dos; do i = 1 to 2000000; aleatorio2 = ranuni(2); output; end; run; Empleamos la opción FULLSTIMER de SAS, que nos ofrece unas estadísticas más detalladas de cada ejecución en el log; fundamentalmente nos interesa el tiempo real de ejecución. Los datasets aleatorios tienen las mismas observaciones y una estructura muy parecida. ...

11 de agosto de 2009 · rvaquerizo

Truco SAS. Transformación EBCDIC (Mainframe)

Hay ocasiones en las que tenemos que leer directamente de entornos Mainframe ficheros DB2; conocemos la estructura de esos ficheros y necesitamos leerlos vía FTP. Para ello tenemos que tener en cuenta la transformación EBCDIC (Extended Binary Coded Decimal Interchange Code) a ASCII (American Standard Code for Information Interchange); esta transformación requiere las siguientes equivalencias entre formatos: Decimales empaquetados: PD5. -> S370FPD5. Enteros binarios: IB5. -> S370FIB5. Carácter: $5. -> $EBCDIC5. Numérico con ceros: Z5. -> S370FZDU5. De modo que para leer el fichero del Mainframe haremos: ...

15 de julio de 2009 · rvaquerizo

Subconjuntos de variables con DROP/KEEP

Me han llegado algunas cuestiones sobre el uso de DROP/KEEP y, a raíz de ello, me he decidido a hacer un mensaje sencillo para que los usuarios menos avanzados de SAS puedan entender su funcionamiento. Sé que muchos lectores son expertos programadores, pero también es necesario tener un rincón con código SAS menos avanzado para aquellos que se estén acercando a esta programación. En este caso partimos de una tabla de datos aleatorios con 102 variables y 10.000 observaciones que generamos mediante el siguiente programa SAS: ...

2 de julio de 2009 · rvaquerizo

Trucos SAS. Muestreo con PROC SURVEYSELECT

Hace varios días planteamos algún truco SAS para la realización de muestras aleatorias. Hoy planteo otro truco para lo mismo, pero empleando el procedimiento PROC SURVEYSELECT. Este procedimiento lo tenemos en el módulo STAT y tiene una sintaxis muy sencilla. Además, nos permite realizar muestreos estratificados de forma muy sencilla; mediante pasos DATA, el muestreo estratificado se complica. Como es habitual, vemos varios ejemplos partiendo de una tabla SAS aleatoria: data ejemplo; do id = 1 to 10000; oficina = ranpoi(5, 1); oficina = min(oficina, 3); importe = ranuni(8) * 1000; output; end; run; proc freq data=ejemplo; tables oficina; run; Tenemos un dataset con 10.000 observaciones que tiene un id, un importe y una oficina. El primer paso es crear una muestra aleatoria simple de tamaño 300; las sentencias adecuadas con el PROC SURVEYSELECT son: ...

15 de junio de 2009 · rvaquerizo

Oracle y SAS vía SQL pass-through

Para trabajar directamente con el motor de BBDD, SAS cuenta con “Pass-through”. SAS crea una conexión al gestor de BBDD y desde ese momento podemos ejecutar sentencias de SQL directamente. Para seguir con la línea de trabajo habitual emplearemos ejemplos para conocer su funcionamiento. Los ejemplos que vamos a emplear serán sobre una BBDD Oracle ya que es muy común trabajar en entornos SAS con acceso a algún datamart de Oracle. Evidentemente la utilidad pass-through o passthru convive perfectamente con las librerías dinámicas de SAS a Oracle. Los ejemplos que vamos a ver serán: ...

12 de junio de 2009 · rvaquerizo

Integración de R con SAS, SPSS y otros

Recientemente se publicó en este blog una entrada haciendo mención a la futura integración de R en SAS. Existe, de hecho, un procedimiento artesanal de lanzar procesos de R desde SAS basado en la posibilidad de realizar llamadas al sistema operativo desde SAS. No obstante, SAS ha decidido ahondar en dicha integración y proporcionarle un marchamo corporativo. Sin embargo, esta iniciativa dista mucho de ser la pionera y merece la pena lanzar una mirada panorámica al mercado. Por ejemplo: ...

3 de junio de 2009 · cgbellosta

Trucos SAS. Pasar de caracter a numérico y viceversa

Llega un gran número de visitas a AyD buscando cómo transformar en SAS variables carácter a numéricas y viceversa. Pero estas visitas están muy poco tiempo, y me he planteado que los mensajes que hay dedicados al uso de PUT e INPUT no son claros. Por este motivo, planteo un truco SAS de transformación de variables muy corto y concreto. Como es habitual, lo vemos con ejemplos: Transformar de carácter a numérico data uno; char = "2009"; num1 = char * 1; num2 = input(char, best16.); run; proc contents data=uno; run; Dos formas de hacerlo: multiplicando por 1 o bien con INPUT(variable, formato). ...

3 de junio de 2009 · rvaquerizo