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 cómo podemos usar array 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 qué 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 transformar estos valores perdidos en ceros:

data uno_sin_missing;
    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=",";
    length nombre apellido1 apellido2 $30;
    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_sin_missing;
    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;
    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.