Macro SAS. Variables de un dataset en una macro variable

Hoy os presento una macro de SAS que nos permite recoger en una macro variable 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: options mlogic mprint; %macro lista_variables (ds= , nombre_mv= , patron=); *ES NECESARIO QUE LA MACROV FINAL SEA GLOBAL; %global &nombre_mv.; *PUEDE SER QUE LA LIBRERIA SEA WORK O PERMANENTE; data _null_; length lib tab $255.; if index("&ds.",".")=0 then lib="WORK"; else lib=scan("&ds.",1,".") ; put lib=; call symput('libreria',lib); tab=scan("&ds.",2,".") ; call symput('tabla',tab); run; *BUSCAMOS EN DICTIONARY DE SAS; proc sql noprint; select compress(name) into:&nombre_mv. separated by " " from sashelp.vcolumn where libname=upcase("&libreria.") and memname=upcase("&tabla.") and /*PODEMOS APLICAR UN PATRON*/ 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 prefererido 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 de la que deseamos obtener las variables en MEMNAME. Como particularidad podemos aplicar patrones. ...

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

Sentencia del Tribunal de Justicia de la UE sobre el caso WPS y SAS

El caso de WPS y SAS por fin tiene un final. World Programing Software ha vencido (por fin) al todo poderoso SAS Institute Inc. La sentencia establece que: De este modo, procede señalar que no puede haber infracción del derecho de autor sobre el programa de ordenador cuando, como sucede en el caso de autos, el adquirente legítimo de la licencia no ha tenido acceso al código fuente del programa de ordenador correspondiente a esa licencia, sino que se limitó a estudiar, observar y verificar ese programa con el fin de reproducir su funcionalidad en un segundo programa. ...

2 de mayo de 2012 · rvaquerizo

Trucos SAS. Eliminación de espacios en blanco

Truco SAS práctico para aquellos que os estáis iniciando en el uso de las funciones de texto con SAS. Se trata de eliminar aquellos espacios en blanco que no son necesarios en una variable. Quería plantearos las posibles soluciones que se me han ido ocurriendo. Algunas de ellas no son eficientes pero es necesario que dispongáis de todas. En la línea habitual planteo un ejemplo para que lo ejecutéis y así podáis analizar los resultados: ...

10 de enero de 2012 · rvaquerizo

What about newer competition from free, open-source alternatives like R?

El tito Goodnight está más pendiente de IBM y Oracle que de R. Está mayor el hombre, pero sigue siendo un genio y un figura. Nunca ha sido mi jefe (no porque yo no quisiera) y no comparto ni una sola de las opiniones que tiene en la entrevista que le hacen pero hay que reconocer que no se ha equivocado mucho en 40 años porque es una de las fortunas más importantes del mundo. Así que le tendré en cuenta, al fin y al cabo llevo 10 años diciento que el futuro pasa por R y empiezo a cansarme, me estoy haciendo más dinosaurio día a día.

16 de julio de 2011 · rvaquerizo

Árboles de decisión con SAS Base (con R por supuesto)

Con SAS Base podemos hacer árboles de decisión porque tenemos R. Así de sencillo. Vamos a utilizar SAS para gestionar nuestros datos y R será la herramienta que utilicemos para la realización del modelo de árbol de decisión. Posteriormente emplearemos las reglas generadas por el modelo para etiquetar a nuestros clientes en SAS. Con esta entrada pretendo ilustrar una serie de ejemplos en los que comunico SAS con R. Una herramienta nos sirve para el tratamiento de datos y la otra la utilizaremos para realizar modelos que no están al alcance de SAS. Para realizar esta comunicación SAS-R os planteo la creación en SAS de ficheros de texto con las instrucciones en R y la ejecución en modo batch de R con ese código creado en SAS. Aquí tenéis punto por punto el ejemplo: ...

12 de julio de 2011 · 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

El debate político o como analizar textos con WPS

¿Qué hacen los políticos españoles en el Congreso de los Diputados? Las tertulias radiofónicas están llenas de analístas políticos que podrán opinar sobre la labor del Congreso mejor que yo. Sin embargo yo tengo WPS, sé programar en SAS y en la web del Congreso están todas las sesiones y todas las intervenciones de la democracia. Pues con estos elementos vamos a iniciar un proceso de text mining, aunque no llegaremos a realizar ningún análisis complejo. Para comenzar, como siempre, necesito datos. Me he guardado la sesión del Congreso de los Diputados del día 26/01/2011 como web y posteriormente con Word la he salvado como fichero de texto (ojo con las codificaciones). De todos modos podéis descargaros aquí el fichero. ...

4 de febrero de 2011 · rvaquerizo