Truco SAS. Transformaciones de variables con arrays
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