A continuación, os planteo un monográfico más orientado a principiantes con SAS. Vamos a realizar un acercamiento a los conjuntos de datos SAS agrupados por variables. La premisa fundamental es: un conjunto de datos SAS está agrupado por una variable si está ordenado por ella. Para ordenar variables empleamos el PROC SORT:

proc sort data=<dataset>;
    by [descending] <variable_ordenacion>;
run;

Repetimos: un conjunto de datos SAS puede agruparse por una o varias variables si está ordenado por ellas. Algunas de las posibilidades que nos ofrecen este tipo de conjuntos de datos son:

  • Buscar máximos y mínimos por grupos.
  • Crear rankings por grupos.
  • Realizar sumarizaciones.
  • Unir conjuntos de datos.

Para ilustrar estos ejemplos vamos a emplear un conjunto de datos SAS de la librería SASHELP llamado SHOES, que todos tenemos en nuestra sesión y que contiene las siguientes variables:

  1. Region
  2. Product
  3. Subsidiary
  4. Stores
  5. Sales
  6. Inventory
  7. Returns

La primera tarea encomendada es encontrar el mínimo y el máximo número de Stores por Product en el total de las regiones:

data ejemplo;
    set sashelp.shoes;
run;

proc sort data=ejemplo; 
    by product stores; 
run;

proc freq data=ejemplo; 
    tables product; 
run;

Trabajamos con una copia del dataset de SASHELP y lo primero es realizar la ordenación por la variable que nos agrupa nuestra tabla y después por la variable que deseamos estudiar. Con PROC FREQ realizamos una tabla de frecuencias y observamos que tenemos ocho grupos, ocho tipos de Product. Una vez realizada la ordenación, a la hora de leer el dataset hemos de emplear la instrucción BY:

data minimos_maximos;
    set ejemplo;
    by product;
    
    if first.product then minimo = stores;
    if last.product then maximo = stores;
    
    if first.product or last.product;
    keep product minimo maximo;
run;

proc print data=minimos_maximos; 
run;

Al emplear la instrucción BY, disponemos de dos nuevas variables de sistema que sólo aparecen durante la ejecución del paso DATA: FIRST.variable y LAST.variable. Estas dos variables no producen salida alguna en el dataset final (a menos que se asignen a otras variables). Como es evidente, FIRST. toma valor 1 (verdadero) cuando estamos ante el primer registro del grupo y LAST. toma el valor 1 cuando estamos ante el último registro del grupo. Como hemos limitado la salida a datos con minimo o maximo, obtenemos registros por cada uno de los grupos de Product.

Otra de las tareas habituales con conjuntos de datos agrupados es la realización de rankings por grupo. Si, por ejemplo, deseamos realizar un ranking de Sales por Region, tendremos que hacer:

proc sort data=ejemplo; 
    by region descending sales; 
run;

data ranking;
    set ejemplo;
    by region;
    retain posicion;
    
    if first.region then posicion = 1;
    else posicion = posicion + 1;
run;

Lo primero es ordenar por Region y descendentemente por Sales. En este ejemplo empleamos una nueva instrucción: RETAIN. Esta instrucción guarda el valor de la variable indicada para la siguiente iteración del paso DATA. Con BY hemos activado FIRST. y LAST.. De esta manera, si estamos ante el primer registro por Region, la posicion del ranking será 1; en caso contrario, sumamos 1 a la variable retenida posicion.

Si deseamos crear sumarizaciones, la metodología será igual que la anterior:

proc sort data=ejemplo; 
    by region; 
run;

data suma_region;
    set ejemplo;
    by region;
    retain total_ventas;
    
    if first.region then total_ventas = sales;
    else total_ventas = sum(total_ventas, sales);
    
    if last.region;
    keep region total_ventas;
run;

La unión de conjuntos de datos SAS tendremos que analizarla en capítulos posteriores, pero es imprescindible recordar que, para unir conjuntos de datos SAS, éstos han de estar agrupados por la variable que realiza la unión.

Como siempre, si tenéis cualquier duda, sugerencia o trabajo a tiempo parcial que me permita jugar más tiempo con mis hijos, podéis contactar conmigo en rvaquerizo@analisisydecision.es. Saludos.