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) cómo 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 qué puede servir esto, pero ahí os planteo cómo se resuelve.

27 de octubre de 2010 · rvaquerizo

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.

7 de octubre de 2010 · rvaquerizo

La función LAG de SAS

La función LAG de SAS nos devuelve el valor de la observación $n - i$ de la variable indicada. Me explico con un ejemplo: data lagn; do i = 1 to 10; lag_1 = lag(i); lag_2 = lag2(i); lag_3 = lag3(i); lag_4 = lag4(i); lag_5 = lag5(i); lag_6 = lag6(i); output; end; run; Esto produce: LAG(i) nos da el valor de i para la observación anterior, LAG2(i) nos da el valor de las 2 observaciones anteriores… In el caso de encontrarnos en las primeras observaciones, el valor que devuelve es el missing. Con ella podemos evitar trabajar con RETAIN a la hora de hacer sumas acumuladas: ...

1 de octubre de 2010 · rvaquerizo

Macros SAS. Dataset a data frame R

Voy a presentaros la versión Beta de la macro de SAS que genera data.frames a partir de una tabla SAS en Windows; la versión en Linux me la ahorraré hasta el día que pueda instalar SAS en mi máquina virtual. La macro la iré mejorando y evolucionando; probablemente estas mejoras no las colgaré y no retomaré el hilo hasta que tenga una V1. El tema es sencillo y anteriormente ya hice mención a este método, pero ahora doy una vuelta de tuerca y directamente creamos data.frames a partir de datasets. Os pongo el total del código y comentaré los pasos más interesantes; por supuesto, es mejorable. Lo que no puedo asegurar es si funciona bajo WPS porque no me han renovado la licencia. Todo el código seguido: ...

28 de septiembre de 2010 · rvaquerizo

Trucos R. Leer archivos XML con R

Un truco de R práctico que busca la colaboración de los lectores para mejorarlo. Se trata de leer ficheros XML con R. Los más asiduos ya sabéis qué paquete voy a emplear: el XML. En los últimos tiempos, la sentencia require(XML) aparece al principio de casi todos mis códigos en el Tinn-R. El ejemplo que ilustrará el truco lee de la BBDD del Banco Mundial en español el indicador de emisiones de CO2 en toneladas por habitante y año. La sintaxis es de este modo: ...

8 de septiembre de 2010 · rvaquerizo

Trucos SAS. Mejor que hash IN para cruzar tablas

El otro día Fernando comentó que los cruces 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 realización de listas; ésto derivará en otro truco SAS en breves días. El caso es que me gustaría que probarais este código: * CONJUNTO DE DATOS GRANDE; data grande; do i = 1 to 20000000; idcliente = int(ranuni(0) * 1000000); output; end; drop i; run; * CONJUNTO DE DATOS PEQUEÑO, SIN DUPLICADOS; data pequenio; do i = 1 to 2000000; idcliente = int(ranuni(34) * 1000000); if mod(idcliente, 1132) = 0 then output; end; drop i; run; proc sort data=pequenio nodupkey; by idcliente; run; * CREAMOS LA LISTA EN UNA MACROVARIABLE; proc sql noprint; select idcliente into :lista separated by " " from pequenio; quit; * CRUCE MEDIANTE SENTENCIA IN; data machea5; set grande; if idcliente in (&lista.); run; Bueno, el tiempo de ejecución de este cruce de tablas es de unos pocos 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. ...

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 carácter a fecha. En mi opinión, R es una de las herramientas más 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ía, mes en inglés y año con cuatro 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 para 10/09/1976). Para meses en formato nombre empleamos %b, pero en este caso "1jan1960" nos produce un valor perdido; sin embargo, "31mar1960" sí se transforma correctamente. ¿Por qué motivo sucede esto? ...

2 de septiembre de 2010 · rvaquerizo

Trucos SAS. Por qué hay que usar objetos hash

Quiero trabajar un poco con objetos hash en SAS. Pero antes quería demostraros, con una comparativa de código muy sencilla y muy rápida, la necesidad de trabajar con estos objetos en SAS. La problemática es muy habitual en nuestro trabajo diario: tenemos una tabla SAS muy grande, con millones de registros, y tenemos que cruzarla con otra tabla SAS muy pequeña para quedarnos sólo con los registros que aparezcan en la tabla pequeña. Tenemos unos clientes que han recibido un contacto comercial y hemos de quedarnos con sus saldos históricos en determinados productos. Veamos los distintos métodos que planteo para machear registros; conjuntos de datos de partida: ...

1 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, sino 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 rankings 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 sí tiene importancia: la fuente que elijamos para el pipe: ...

13 de agosto de 2010 · rvaquerizo

Trucos SAS. Matrices de adyacencia con SAS

SAS no está pensado para el cálculo matricial, pero hay ocasiones en las que hemos de trabajar con ellas. Uno de los casos típicos es la matriz de adyacencia. Se trata de partir de estos datos: a b a e b c b e c e d a Para crear: a b c d e a 0 1 0 1 1 b 1 0 1 0 1 c 0 1 0 0 1 d 1 0 0 0 0 e 1 1 1 0 0 Yo planteo la siguiente metodología: ...

5 de agosto de 2010 · rvaquerizo