Data Step

Transformación de datos SAS: Pasar de formato "Largo" a formato "Ancho" y ordenamientos personalizados

Simon 8 vistas

Al manipular datos en SAS©, a menudo es necesario reorganizar la estructura de una tabla. Un caso clásico es la conversión de un conjunto de datos donde las categorías se enumeran en filas (formato "largo") a un formato donde estas categorías se convierten en columnas distintas (formato "ancho" o "wide").

Este artículo explora cómo realizar esta transformación, calcular sumas de manera robusta y aplicar una lógica de ordenamiento compleja.

El Escenario

Imaginemos una tabla de origen llamada Population1 que contiene datos demográficos por nación y por género:

Transformación de datos SAS: Pasar de formato "Largo" a formato "Ancho" y ordenamientos personalizados -

El objetivo es obtener una tabla Population2 estructurada de la siguiente manera, con una columna para el total y columnas distintas para cada género:

Transformación de datos SAS: Pasar de formato "Largo" a formato "Ancho" y ordenamientos personalizados -

Paso 1: La Transposición de los Datos

Aunque técnicamente es posible utilizar un paso DATA complejo con instrucciones RETAIN y condiciones, el método más eficaz y menos propenso a errores se basa en el procedimiento TRANSPOSE.

Antes de transponer, es imperativo ordenar los datos por la variable de agrupación (aquí, la Nación).

1/* 1. Tri préalable indispensable */
2PROC SORT DATA = population1;
3 BY Nation;
4RUN;
5 
6/* 2. Transposition */
7PROC TRANSPOSE DATA = population1 out = temp_pop(drop=_name_);
8 BY Nation; /* La ligne devient unique par Nation */
9 id Gender; /* Les valeurs de Gender deviennent les noms de colonnes */
10 var Number; /* Ce sont ces chiffres qui remplissent les colonnes */
11RUN;
En esta etapa, la tabla contiene las columnas Nación, Hombres y Mujeres.
Transformación de datos SAS: Pasar de formato "Largo" a formato "Ancho" y ordenamientos personalizados -

Paso 2: Cálculo del Total y Gestión de los Valores Faltantes

Una vez creadas las columnas, debemos calcular la población total. Existe una diferencia crucial entre la suma aritmética simple y la función de suma en SAS©.

El enfoque ingenuo

1Population = Men + Women;
Si una de las dos variables (Men o Women) contiene un valor faltante (missing value), el resultado de la operación también será faltante.

El enfoque recomendado

1Population = sum(Men, Women);
La función SUM() ignora los valores faltantes (tratándolos como ceros). Si se tienen datos para hombres pero no para mujeres, el total mostrará de todos modos la cifra de hombres en lugar de un valor nulo, lo que suele ser el comportamiento deseado.

Paso 3: Ordenamiento Personalizado (Lógica condicional)

Supongamos ahora una restricción de ordenamiento específica:

  1. Ordenar las naciones por Población decreciente.

  2. Excepción: Una nación específica (ej: "MyCountry") debe aparecer imperativamente en última posición, independientemente de su cifra de población.

Para lograr esto sin modificar los datos mostrados, el truco consiste en crear una variable de ordenamiento temporal (o "rank").

La lógica

Asignamos a esta variable de ordenamiento el valor de la población para todas las naciones, excepto para la excepción, a la que asignamos un valor artificialmente bajo (por ejemplo, -1).

1DATA population2;
2 SET temp_pop;
3
4 /* Calcul de la somme robuste */
5 Population = sum(Men, Women);
6 
7 /* Création de la variable de tri temporaire */
8 IF Nation = "MyCountry" THEN SortKey = -1;
9 ELSE SortKey = Population;
10RUN;
11 
12/* Tri final sur la clé temporaire */
13PROC SORT DATA = population2;
14 BY descending SortKey;
15RUN;
16 
17/* Nettoyage final : on retire la clé de tri */
18DATA population2;
19 SET population2(drop=SortKey);
20RUN;

Para transformar eficazmente una tabla:

  1. Utilice PROC SORT y luego PROC TRANSPOSE con una instrucción ID para pivotar las filas en columnas.

  2. Priorice la función SUM() sobre el operador + para evitar la propagación de valores faltantes.

  3. Para ordenamientos complejos (como forzar una fila al final de la tabla), cree una variable técnica temporal, ordene por ella y luego elimínela.