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: ```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. Esto pasado a una macro: ```sas %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 mi hoy me ha sido útil. Saludos.

23 de agosto de 2012 · rvaquerizo

Truco SAS. Macro número de días de un año

Macro de SAS que te dice el número de días que tiene un año. %macro dias_anio(anio); "31DEC&anio."d-"01JAN&anio."d+1 %mend; A lo mejor ya la he puesto, no me lo tengáis en cuenta.

7 de junio de 2012 · rvaquerizo

Macros (fáciles) de SAS. Días de un mes en una fecha

Macro de SAS fácil y rápida que nos permite saber el número de días que tiene el mes de una fecha de SAS. La tenía para la automatización de un código que con una media y daba guerra cuando se trataba de un año bisiesto. 3 líneas de código: %macro dias(fec); ((&fec-day(&fec)+1)+31-day((&fec-day(&fec)+1)+31))-(&fec-day(&fec)) %mend; El razonamiento es sencillo. Se trata de poner a día 1 la fecha que le pasamos, irnos un mes después y hacer la diferencia. Por supuesto copiáis y pegáis el ejemplo en el editor: ...

29 de mayo de 2011 · rvaquerizo

Lectura de ficheros SAS7BDAT de SAS directamente con R

Un post de BIOSTATMATT que nos conduce a un código en R que nos permite leer datasets de SAS directamente con R sin necesidad de tener SAS. Un problema recurrente que abordaré con más detenimiento otro día [ahora me voy a pescar]. Aquí tenéis el enlace: http://biostatmatt.com/archives/1216 Sólo tenéis que cargar la funciónread.sas7bdat que tenéis en este enlace. Y ya podéis leer conjuntos de datos SAS. Ejemplo: ```r source("http://biostatmatt.com/R/sas7bdat.R") datos = read.sas7bdat("D:\\raul\\Trabajo\\salida\\p03.sas7bdat") De momento lo he probado en conjuntos de datos SAS sin índices y sin comprimir, si encuentro algún problema primero se lo reporto a la gente que ha creado esta función y más tarde os lo comento.

19 de abril de 2011 · rvaquerizo

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: ...

10 de noviembre de 2010 · rvaquerizo

Trucos Excel. Archivos de un directorio con una macro

Puede resultarnos útil tener todos los archivos de un directorio en una tabla de excel. Si estamos documentando un proceso, si nos dan un gran número de ficheros y tenemos que realizar procesos repetitivos sobre ellos, si queremos tener inventariados nuestros programas,… Para esto os planteo una macro bien sencilla que recorre un directorio y nos escribe los elementos que encuentra en él. El código visual basic para la macro en Excel no puede ser más sencillo: ...

2 de noviembre de 2010 · rvaquerizo

Trucos SAS. Mejor que hash IN para cruzar tablas

El otro día Fernando comentó que los cruce de tablas más rápidos entre tablas grandes y tablas pequeñas son las sentencias condicionales sobre listas. Tiene razón. Es una práctica muy habitual en SAS cuando leemos tablas de Oracle la ralización de listas, esto derivará en otro truco SAS en breves días. El caso es que me gustaría que probárais este código: data grande; do i=1 to 20000000; idcliente=int(ranuni(0)*1000000); drop i; output; end; run; *CONJUNTO DE DATOS PEQUEÑO, NO TIENE REGISTROS DUPLICADOS; data pequenio; do i=1 to 2000000; idcliente=int(ranuni(34)*1000000); drop i; if mod(idcliente,1132)=0 then output; end; run; proc sort data=pequenio nodupkey; by idcliente;quit; *; proc sql noprint; select idcliente into:lista separated by " " from pequenio ; quit; *; data machea5; set grande; if idcliente in (&lista.); run; Bueno, el tiempo de ejecución de este cruce de tablas es de 3 segundos. Mejora a las soluciones planteadas el otro día y sobre todo es un código fácil, muy fácil. Se trata de crear listas de macrovariables y realizar un paso data con una sentencia condicional. Tiene un problema, el tamaño máximo que nos permite una macrovariable. Y en este punto continúa el truco SAS. ¿Cuál es el tamaño máximo que puede tener una macrovariable? 64K, 65534 characters. Tenemos que evitar a toda costa este error: ERROR: The length of the value of the macro variable LISTA (70356) exceeds the maximum length (65534). The value has been truncated to 65534 characters. Para evitar este problema podemos realizar el siguiente planteamiento: 65.000/la longitud del campo de cruce, en el caso del ejemplo: 65.000/8 = 8.000 más o menos. Hacemos una prueba: ...

6 de septiembre de 2010 · rvaquerizo

Trucos R. Establecer la configuración local de una fecha

Cuando manejamos datos las fechas nos producen muchos quebraderos de cabeza, por ejemplo cuando tenemos que transformar un caracter a fecha. En mi opinión R es una de las herramientas las flexibles y rápidas para trabajar con fechas, claro que acostumbrado a SAS cualquier otra herramienta me parece perfecta. A lo que vamos, imaginemos la siguiente situación : ?as.Date x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960") z <- as.Date(x, "%d%b%Y") z [1] NA NA "1960-03-31" "1960-07-30" Se trata de transformar un texto a fecha en R. El formato del texto es d mes en inglés año con 4 cifras. Para transformar a fecha tenemos la función as.Date que recibe como parámetros el objeto y el formato de la fecha, el más habitual sería %d/%m/%Y 10/09/1976. Para meses en formato nombre empleamos %b pero en este caso "1jan1960" nos produce un valor perdido sin embargo "31mar1960" si se transforma correctamente ¿Por qué motivo sucede esto? ...

2 de septiembre de 2010 · rvaquerizo

Trucos Excel. Gráficos con caracteres

Quería plantear hoy un truco Excel que no es un truco como tal, si no más bien una idea para que podáis hacer más vistosos vuestros informes con gráficos de caracteres, sobre todo para aquellos dinosaurios que hagáis muchos ranking o puntuaciones. La idea es muy sencilla se trata de emplear la función REPETIR de Excel pero «con talento». =REPETIR(«|»;E12) nos repite el pipe | tantas veces como le indiquemos en la casilla E12. Pero hay algo que si tiene importancia, la fuente que elijamos para el pipe: ...

13 de agosto de 2010 · rvaquerizo

Trucos R. La función mod para R

Buscando algunas cosas sobre R he encontrado esta función que hice hace mucho tiempo. De hecho puedo decir que de las primeras que hice allá en 2001 (creo) cuando empecé a conocer esto de R. Por aquellos entonces aseguré que el futuro pasaba por R y 9 años después sigo diciendo lo mismo, el tiempo me dará la razón, lo que no me imaginaba que hacía falta tanto tiempo. En fin, historias del dinosaurio. Vamos con la función «histórica». Al no disponer de la función mod en R la programé: ...

27 de julio de 2010 · rvaquerizo