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:
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:
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. Tri préalable indispensable */
proc sort data = population1;
by Nation;
run;
/* 2. Transposition */
proc transpose data = population1 out = temp_pop(drop=_name_);
by Nation; /* La ligne devient unique par Nation */
id Gender; /* Les valeurs de Gender deviennent les noms de colonnes */
var Number; /* Ce sont ces chiffres qui remplissent les colonnes */
run;
1
/* 1. Tri préalable indispensable */
2
PROC SORTDATA = population1;
3
BY Nation;
4
RUN;
5
6
/* 2. Transposition */
7
PROC TRANSPOSEDATA = 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 */
11
RUN;
En esta etapa, la tabla contiene las columnas Nación, Hombres y Mujeres.
Paso 2: Cálculo del Total y Gestión de los Valores Faltantes
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
Population = sum(Men, Women);
1
Population = 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.
Supongamos ahora una restricción de ordenamiento específica:
Ordenar las naciones por Población decreciente.
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).
data population2;
set temp_pop;
/* Calcul de la somme robuste */
Population = sum(Men, Women);
/* Création de la variable de tri temporaire */
if Nation = "MyCountry" then SortKey = -1;
else SortKey = Population;
run;
/* Tri final sur la clé temporaire */
proc sort data = population2;
by descending SortKey;
run;
/* Nettoyage final : on retire la clé de tri */
data population2;
set population2(drop=SortKey);
run;
1
DATA 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;
10
RUN;
11
12
/* Tri final sur la clé temporaire */
13
PROC SORTDATA = population2;
14
BY descending SortKey;
15
RUN;
16
17
/* Nettoyage final : on retire la clé de tri */
18
DATA population2;
19
SET population2(drop=SortKey);
20
RUN;
Para transformar eficazmente una tabla:
Utilice PROC SORT y luego PROC TRANSPOSE con una instrucción ID para pivotar las filas en columnas.
Priorice la función SUM() sobre el operador + para evitar la propagación de valores faltantes.
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.
Important Disclaimer
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.