Truco SAS. Transformaciones de variables con arrays

18 Sep

Hacer ceros los missing en un dataset. Crear una etiqueta «NO DISPONIBLE» en campos carácter sin valores. Cuando trabajamos con SAS es una situación más que habitual. A continuación voy a plantear un par de ejemplos de como podemos usar arrays de variables en SAS para realizar una transformación «masiva» de variables de nuestro conjunto de datos.

Poner missing numéricos a 0:

Lo primero es destacar que no siempre un valor perdido equivale a 0. Cuando realizamos modelos es necesario tener en cuenta que hacemos con los missing, el siguiente ejemplo transforma todos los . de un dataset a 0:


*DATASET DE EJEMPLO QUE GENERA DIVISIONES POR 0;
data uno;
 do id=1 to 200;
 importe1=ranuni(2)/ranpoi(9,2) * 10000;
 importe2=ranuni(1)/ranpoi(12,2) * 1000;
 venta1=ranuni(3)/ranpoi(5,1) * 1000;
 venta4=ranuni(6)/ranpoi(7,4) * 10000;
 output;
 end;
run;

Partimos de un dataset aleatorio que genera divisiones por 0, que genera valores perdidos. Necesitamos tranformar estos valores perdidos en ceros:


data uno;
 set uno;
*ARRAY DE DIMENSION TOTAL DE NUMERICAS;
 array c (*) _numeric_;
*BUCLE QUE RECORRE EL ARRAY;
 do i = 1 to dim(c);
  if c(i)=. then c(i)=0;
 end;
 drop i;

run;

Creamos un array c que recoge todas las variables numéricas lo recorremos y transformamos las variables.

Valores de texto «NO DISPONIBLE»:

En este caso se trata de recorrer una tabla y poner los valores missing de caracteres con el valor «NO DISPONIBLE».

data dos;
infile datalines delimiter=",";
format nombre apellido1 apellido2 15.;
input nombre
apellido1 apellido2;
datalines;
RAUL,VAQUERIZO,
MARIA JOSE,FERNANDEZ,LOPEZ,
LUCAS,EXPOSITO,DAZA,
 ,MIER,DAZA
RICARDO,ENRIQUEZ,
;
run;

Generamos un dataset con nombres. Algunos de estos nombres no tienen valores para el segundo apellido o el nombre. Hemos de recorrer la tabla y sustituir valores:


data dos;
 set dos;
 array c (*) _character_;
 do i=1 to dim(c);
  if missing(c(i)) then c(i)="NO DISPONIBLE";
 end;
 drop i;
run;

Metodología completamente análoga a la anterior. Además podemos emplearla para buscar registros dentro de tablas. Imaginemos que deseamos identificar todas las personas que se apellidan Daza:

data tres;
 set dos;
 array c (*) _character_;
 do i=1 to dim(c);
  if index(upcase(c(i)),»DAZA»)>0 then output tres;
 end;
 drop i;
run;

Este truco es muy útil para recorrer tablas de dimensiones en busca de valores. Por supuesto cualquier duda… rvaquerizo@analisisydecision.es

4 respuestas a «Truco SAS. Transformaciones de variables con arrays»

  1. POR FAVOR NECESITO AYUDA LO QUE NECESITO ES LO SIGUIENTE:

    DATA PRUEBA;
    CONTADOR = 10;
    ARRAY VEC{CONTADOR};

    ESTO ME DA ERRORES COMO LO PODRÍA CORREGIRLO

  2. Hola, solo puedes poner una constante. SAS entiende que estás poniendo una variable. Tienes dos opciones o crearlo mediante una macro variable o bien poner el *.

    Saludos.

  3. Primeramente agradeciendote rvaquerizo por respoder.
    La primera opcion que me das no me funciona o talvez la estoy haciendo mal si tuvieras un ejemplo te agradeceria.

Los comentarios están cerrados.