PROC FCMP para crear funciones en SAS

28 Oct

Unas pinceladas del PROC FCMP para SAS. Este procedimiento nos permite crear nuestras propias funciones que posteriormente podremos utilizar en nuestras sesiones de SAS. yo he programado mucho en SAS y tengo que decir que no utilizo mucho este procedimiento por la propia filosofía de SAS. Al final siempre se tiende a crear una macro antes que una función, pero hay que reconocer que el lenguaje macro de SAS en ocasiones no es sencillo y muchos olvidamos el PROC FCMP. En mi caso concreto hago unas macros muy enrevesadas antes que programarme una función. Para ilustrar el ejemplo de uso vamos a crear una función dif_anios para determinar la diferencia en años entre dos fechas SAS. El código es:

proc fcmp outlib=sasuser.fun.pru; 
function dif_anios(ini_date, fin_date); 
n1 = year(fin_date)-year(ini_date);
if month(fin_date)

El PROC FCMP guarda las funciones en una librería, en este caso se recomienda guardar en SASUSER y es necesario usar un nombre de 3 niveles aunque el resultado final de esta ejecución será un conjunto de datos SAS llamado FUN creado en la librería SASUSER que contiene las instrucciones necesarias para la función. La función necesita dos parámetros ini y fin date, dentro de ella empleamos código SAS, el mismo que si no usáramos la función. Por último retornamos un valor como resultado de nuestra función.

Para poder emplear la función sólo tenemos que hacer:

options cmplib=sasuser.fun; 

  data _null_;
   start = '15Feb2007'd;
   today = '27Mar2008'd;
   sd = dif_anios(start, today); 
     put sd=;
  run;

Con la opción cmplib compilamos rutinas en la librería especificada, ya os digo que lo recomendable es SASUSER o bien una librería común en la que se guarden todas las funciones. Una vez hagáis eso ya estáis en disposición de poder utilizar vuestra función. Saludos.

4 respuestas a «PROC FCMP para crear funciones en SAS»

  1. Hola, tengo un problema y no sé muy bien si PROC FCMP me podría ayudar a resolver. Dentro de un data step intento crear una columna dinamica:

    campo1 = «col» || _N_;

    El problema es que el nombre de esa columna dinámica contiene espacios o tabuladores por lo que queda algo así: «col 1».
    He intentado usar compress, %cmpres, %trim… e incluso una macro propia (%string_replace) para eliminar usos carácteres indeseados.

    Qué solución me recomiendas?

    muchas gracias.

  2. Hola,
    me estoy volviendo loca para encontrar una función de sistema, estilo varnum, que me devuelva el número de variables que tiene un data set,

    Antes de recurrir a crear una función creo que debe existir una del sistema

    gracias!

Deja una respuesta

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