Macros SAS. Dataset a data frame R

28 Sep

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 retome 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 data sets. 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:


%macro SASaR(datos,directorio,nombre);
*MODIFICAMOS EL NOMBRE Y EL DIRECTORIO PARA R;
%let nombre=&nombre..Rdata;
%let directorio=%sysfunc(tranwrd(&directorio.,\,/));
*EXPORTACION A CSV DEL DS;
PROC EXPORT DATA= &datos.
OUTFILE= "&directorio./elimina.csv"
DBMS=CSV REPLACE;
PUTNAMES=YES;
RUN;
*CREAMOS UN PROGRAMA EN R QUE LEE EL CSV
 GENERADO Y LUEGO LO GUARDA;
filename pgm "&directorio./pgm.R";
*ESTABLECEMOS EL DIRECTORIO, LEEMOS Y GUARDAMOS;
data _null_;
file pgm;
put "setwd('&directorio.')";
put "df <- read.csv('elimina.csv')";
put " ";
int="save(df,file='"||"&nombre."||"')";
put int;
run;
*CREAMOS UN EJECUTABLE DE WINDOWS QUE ABRE R
 Y EJECUTA LA LECTURA DEL DF;
filename open "&directorio./ejecucion.bat";
data _null_;
file open;
put '"C:/Archivos de programa/R/R-2.10.1/bin/R.exe"'@@;
put ' CMD BATCH --no-save "'@@;
put "&directorio/pgm.R"@@;
put '"';
call sleep (150);
run;
*EJECUTAMOS EL BAT DE WIN;
options noxwait xsync;
x "cd %quote(&directorio.)";
x "ejecucion.bat";
*ELIMINAMOS LOS ARCHIVOS TEMPORALES;
x "del elimina.csv";
x "del pgm.R";
x "del ejecucion.bat";
*VEMOS EL RESULTADO DE LA IMPORTACION;
proc fslist fileref="&directorio.\pgm.Rout"; quit;
%mend;
*EJEMPLO DE USO;
%sasaR(sashelp.shoes,C:\temp\pruebas proceso,df1);

Ahí tenéis la macro que genera el script de Win. Analizamos lo más interesante paso a paso:


*MODIFICAMOS EL NOMBRE Y EL DIRECTORIO PARA R;
%let nombre=&nombre..Rdata;
%let directorio=%sysfunc(tranwrd(&directorio.,\,/));

Un pequeño cambio a los nombres para evitar problemas con R y los directorios con barras \.


*EXPORTACION A CSV DEL DS;
PROC EXPORT DATA= &datos.
OUTFILE= "&directorio./elimina.csv"
DBMS=CSV REPLACE;
PUTNAMES=YES;
RUN;

Exportamos el conjunto de datos SAS a CSV, un fichero temporal que posteriormente borraremos.


*CREAMOS UN PROGRAMA EN R QUE LEE EL CSV
 GENERADO Y LUEGO LO GUARDA;
filename pgm "&directorio./pgm.R";
*ESTABLECEMOS EL DIRECTORIO, LEEMOS Y GUARDAMOS;
data _null_;
file pgm;
put "setwd('&directorio.')";
put "df <- read.csv('elimina.csv')";
put " ";
int="save(df,file='"||"&nombre."||"')";
put int;
run;

El programa R realiza un read.csv del temporal y guarda un objeto de R con el nombre que especificamos.


*CREAMOS UN EJECUTABLE DE WINDOWS QUE ABRE R
 Y EJECUTA LA LECTURA DEL DF;
filename open "&directorio./ejecucion.bat";
data _null_;
file open;
put '"C:/Archivos de programa/R/R-2.10.1/bin/R.exe"'@@;
put ' CMD BATCH --no-save "'@@;
put "&directorio/pgm.R"@@;
put '"';
call sleep (150);
run;

Creamos un batch de R con la opción –no-save para que no guarde cambios, ya guardamos nosotros con save. En este punto cada uno tendrá instalado R en distintos directorios, tendréis que modificar a mano el código. Este batch llama al código R del programa pgm.R


*EJECUTAMOS EL BAT DE WIN;
options noxwait xsync;
x "cd %quote(&directorio.)";
x "ejecucion.bat";
*ELIMINAMOS LOS ARCHIVOS TEMPORALES;
x "del elimina.csv";
x "del pgm.R";
x "del ejecucion.bat";
*VEMOS EL RESULTADO DE LA IMPORTACION;
proc fslist fileref="&directorio.\pgm.Rout"; quit;

En este punto si hay algo interesante, para evitar problemas las opciones de S.O. que recomiendo son noxwait y xsync para que se ejecuten las sentencias X una a una y no de golpe. Por último vemos el fichero de resultados de R con el PROC FSLIST, así podremos analizar los resultados obtenidos.

Creo que desgranando la macro todo queda más sencillo de comprender. Ahora ya podréis aprovechar R con SAS o SAS con R, eso no me queda tan claro aun. Saludos.

4 respuestas a «Macros SAS. Dataset a data frame R»

  1. ¿Hay alguna sentencia SAS con la que yo pueda conocer cuál es el módulo al que pertenece un PROC concreto?

    Muchas gracias

  2. Sería el PROC ARBOR ¿En serio no hay ninguna otra manera que ir por la ayuda? Es que cuando no sabes en qué módulo buscar es un poco difícil encontrar nada, además de que este PROC debe de ser relativamente nuevo.

  3. Da tufillo a procedimiento específico de Enterprise Miner como el INTREE (por ejemplo). He investigado un poco y parece que sirve para crear árboles de decisión. Pero en el EM 4 no lo veo por ningún sitio.

    Si estás implementado un código obtenido con Miner ten en cuenta las versiones porque la 5 (que ni he visto) parece que la han modificado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *