Truco SAS. Retrasar una ejecución con SLEEP

El método más sencillo para ejecutar SAS a una hora determinada es el empleo de la función SLEEP: data _null_; momento = "03OCT2013:10:07"dt; duerme_hasta = sleep(momento - datetime(), 1); run; Un truco muy sencillo que da respuesta a una duda planteada en el blog. Pensé que ya existía esta entrada. Saludos.

3 de octubre de 2013 · rvaquerizo

Truco SAS. Eliminar retornos de carro o saltos de línea engorrosos

Cuando tenemos saltos de línea o retornos de carro que nos dificultan las lecturas de ficheros de texto, podemos leer carácter a carácter con SAS y eliminar esos caracteres incómodos. data _null_; length char $1.; infile 'C:\fichero_de_entrada.TXT' lrecl=1 recfm=F missover dsd; file 'C:\fichero_de_entrada_depurado.TXT' lrecl=1 recfm=F; input char $char1.; if rank(char) = 13 /* SI ES WINDOWS PONER EL 13 */ then char = " "; put char $char1.; run; Recomiendo no sobrescribir el fichero de texto y crear otro “depurado”. Tendréis este problema cuando vuestro programa SAS os lea menos observaciones de las esperadas. Esto suele pasar cuando trabajamos con archivos de distintos sistemas operativos; como por ejemplo cuando leemos un archivo de texto Unix con una máquina Windows. Saludos.

30 de septiembre de 2013 · rvaquerizo

Mosaic plot con R

Los gráficos de mosaico (mosaic plot) me gustan cada vez más. Hoy quería confesaros una cosa: no me gustan los gráficos. Sé que en esta bitácora electrónica hay muchos ejemplos de gráficos y muchos trucos referentes a ellos, pero siempre prefiero un dato representado en una tabla. Después de esta confesión, voy a rebatirme a mí mismo: es muy complicado ver algo en una tabla de contingencia cuando tenemos tres o cuatro dimensiones. Sin embargo, con un mosaic plot como el que tenemos arriba, somos capaces de estudiar cruces de frecuencia para 3-4 dimensiones. ...

23 de abril de 2013 · rvaquerizo

Truco SAS. Limpiar un fichero de texto con SAS

El otro día me llegó al correo la siguiente cuestión acerca de caracteres extraños en un fichero de texto y la importación a SAS: Tengo un problema a la hora de importar a SAS un fichero .txt. El caso es que tiene en algunos registros el carácter “flechita”. Ejemplo: Calle Paseo de la Castellana “flechita” 60. Cuando lo importo como carácter, para al llegar a la flechita. No sé si podrás ayudarme. Muchas gracias por adelantado. ...

4 de marzo de 2013 · rvaquerizo

Truco SAS. Ver el contenido de un formato

Para ver los valores que toma un formato con SAS, tenemos que emplear el PROC FORMAT. La sintaxis es muy sencilla: proc format library = work.formats fmtlib; select &formato.; run; Tenéis que poner el nombre del formato sin punto. Sintaxis sencilla, pero difícil de recordar (por lo menos a mí me ha pasado). Saludos.

6 de febrero de 2013 · rvaquerizo

Macros SAS. Contar las palabras de una macro variable

Una macro de SAS interesante que nos permite ahorrar código. Dada una macro variable necesitamos contar el número de palabras que tiene esta macro variable. Para ello vamos a crear una función con código macro: %let texto = uno dos tres; %macro cuenta(mv); %eval(%sysfunc(length(%cmpres(&mv.),%str( ))) - %length(&mv.) + 1) %mend; %put La Macrovariable Texto tiene %cuenta(&texto.) palabras; Vemos que la macro variable texto tiene tres palabras y necesitamos contabilizarlas para automatizar un código. La propuesta que se plantea es el cálculo de la longitud de la macro sin espacios frente a la longitud de la macro variable con espacios. La diferencia más uno será el número de palabras de nuestro texto. Como aspectos interesantes tenéis el uso de %str( ) , %cmpres y como se juega con %sysfunc para evitar algún que otro problema. Esta macro tiene sus problemas, no pongáis más de dos espacios que la volvéis loca. Pero puede resultar muy útil para determinadas cosas. Saludos.

11 de diciembre de 2012 · rvaquerizo

La macro iterlist para automatizar código SAS

Impresionante macro de SAS que nos puede ahorrar picar mucho mucho código. La macro se llama iterlist y la he encontrado en este enlace. Es código SAS muy avanzado: %macro iterlist(code =, list =); %*** ASIGNAMOS CADA ELEMENTO DE LA LISTA A UNA MACROVARIABLE INDEXADA &&ITEM&I ; %let i = 1; %do %while (%cmpres(%scan(&list., &i.)) ne ); %let item&i. = %cmpres(%scan(&list., &i.)); %let i = %eval(&i. + 1); %end; %*** GUARDAMOS EL CONTEO TOTAL ; %let cntitem = %eval(&i. - 1); %*** REEMPLAZAMOS EL TOKEN ? CON LOS ELEMENTOS DE LA LISTA ; %do i = 1 %to &cntitem.; %let codeprp = %qsysfunc(tranwrd(&code., ?, %nrstr(&&item&i..))); %unquote(&codeprp.) %end; %mend iterlist; El funcionamiento es muy complejo; destacaría el uso de %qsysfunc. El caso es que nos permite pasar listas de código. Imaginemos que tenemos que hacer la siguiente tarea: ...

17 de octubre de 2012 · rvaquerizo

Trucos Excel. Unir todos los Excel en uno, versión muy mejorada

El amigo José nos envía una nueva versión de la macro de Excel que nos permite unir varios Excel en uno. En este enlace en formato RAR tenéis un ejemplo de funcionamiento, donde el libro de Excel más importante es UNIR.XLSM. Las instrucciones de uso son: Ponemos todos los Excel que deseemos unir en un directorio. Ponemos UNIR.XLSM en ese directorio. Abrimos UNIR.XLSM y simplemente pulsamos el botón. Tenemos un nuevo libro llamado UNIDOS.XLS. Así de sencillo. El código que emplea la macro es visible; su autor no pone problemas. Muchas gracias, José, por esta macro tan sencilla y tan práctica; seguro que muchos de vosotros la encontraréis muy útil. Yo la encuentro genial. Saludos.

25 de septiembre de 2012 · rvaquerizo

Macro SAS. Variables de un dataset en una macrovariable

Hoy os presento una macro de SAS que nos permite recoger en una macrovariable las variables de un conjunto de datos SAS. Tiene como particularidad que nos sirve para seleccionar aquellas variables que tienen un determinado patrón, del tipo consumo2010, consumo2011… Es un código un poco más complejo de lo habitual pero tiene aspectos interesantes: %macro lista_variables(ds=, nombre_mv=, patron=); * ES NECESARIO QUE LA MACROVARIABLE FINAL SEA GLOBAL; %global &nombre_mv.; * DETERMINAMOS LIBRERÍA Y TABLA; data _null_; length lib tab $255.; if index("&ds.", ".") = 0 then do; lib = "WORK"; tab = "&ds."; end; else do; lib = scan("&ds.", 1, "."); tab = scan("&ds.", 2, "."); end; call symput('libreria', upcase(lib)); call symput('tabla', upcase(tab)); run; * BUSCAMOS EN DICTIONARY DE SAS (VCOLUMN); proc sql noprint; select compress(name) into :&nombre_mv. separated by " " from sashelp.vcolumn where libname = "&libreria." and memname = "&tabla." and upcase(name) like "%" || "%upcase(&patron.)" || "%"; quit; %mend; El elemento principal de esta macro es una consulta a una de las tablas DICTIONARY de SAS, o mejor dicho, a una de las vistas que tenemos en SASHELP. Siempre he preferido consultar las vistas de SASHELP. La vista consultada es VCOLUMN, de donde extraemos la columna NAME, y como condicionantes pasamos la librería en LIBNAME y el nombre de la tabla en MEMNAME. Como particularidad, podemos filtrar por patrones de nombre. ...

6 de septiembre de 2012 · rvaquerizo

Macro (fácil) de SAS. Longitud de la parte decimal de un número

Muy sencillo; vemos el programa y posteriormente lo transformamos en una macro de SAS: data aleat; do i = 1 to 100; aleatorio = ranuni(8) * 1000; largo_decimal = length(scan(put(aleatorio, best32.), 2, ".")); output; end; run; Sencillo: pasamos de número a carácter con PUT y buscamos el punto con SCAN, extraemos la segunda parte del carácter separado por punto y vemos su longitud con LENGTH. Esto pasado a una macro: %macro largo_decimal(num); length(scan(put(&num., best32.), 2, ".")) %mend; data aleat; do i = 1 to 100; aleatorio = ranuni(8) * 1000; largo_decimal = %largo_decimal(aleatorio); output; end; run; Sencillo; a mí hoy me ha sido útil. Saludos.

23 de agosto de 2012 · rvaquerizo