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