Macros SAS. Pasar de texto a numérico

“Pasar de texto a número en SAS”. Una de las búsquedas que más recibe esta web. Ya hay monográficos, trucos, artículos,… al respecto. Pero faltaba una macro que espero os ayude. Es una macro muy básica pero que permite pasar textos con números en formato europeo o en formato americano. La macro: %macro texto_numero(varib_ini=, varib_fin=,europeo=0); vaux=&varib_ini.; drop vaux; %if &europeo. %then %do; vaux = compress(vaux,"."); %end; %if &europeo. %then %do; vaux = tranwrd(vaux,",","."); %end; &varib_fin. = input(vaux * 1,best12.); %mend; Breve descripción. La variable inicial (varib_ini) será la cadena de texto que deseamos pasar a número. La variable final (varib_fin) será el nombre de la variable numérica. Si deseamos conservar el nombre tenemos que jugar con rename como opción de lectura o escritura del paso data. Estoy estudiando otra macro más avanzada para realizar este trabajo. El parámetro europeo=0 es el que nos indica si el número que transformamos tiene formato europeo o no. La macro necesita una variable auxiliar (vaux) para realizar las transformaciones necesarias en el caso de ser un número en formato europeo. Una vez está el número en formato americano realizamos la transformación sobre la variable final con input, el formato que ponemos es best12.. ...

10 de octubre 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

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

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 Programming Software ha vencido (por fin) al todopoderoso 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 diciendo 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 Base. 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 el ejemplo paso a paso: ...

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 in 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 Solo tenéis que cargar la función read.sas7bdat que tenéis in este enlace. Y ya podéis leer conjuntos de datos SAS. Ejemplo: source("http://biostatmatt.com/R/sas7bdat.R") datos <- read.sas7bdat("D:\\raul\\Trabajo\\salida\\p03.sas7bdat") De momento lo he probado in 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. Saludos.

19 de abril de 2011 · rvaquerizo