Trasponer datos con SAS es un tema que genera un gran número de consultas en Google, por lo tanto genera un gran número de visitas a este blog. Ya hay un monográfico al respecto pero hoy quería volver a contar la trasposición de datos con SQL y SAS pero a un nivel más bajo para que sea lo más sencillo posible. En el ejemplo partimos de una tabla con 3 variables, un id_cliente, un campo tipo y un campo precio. Cada tipo tiene un precio y necesitamos que nuestro dataset tenga un registro por id_cliente y 3 precios, uno por cada tipo. El ejemplo en código SAS:
data datos;
input id_cliente $ tipo precio;
datalines;
A 1 100
A 2 150
A 3 120
B 1 200
B 2 250
B 3 220
C 1 300
C 2 350
C 3 320
D 1 400
D 2 450
D 3 420
;run;
Esta es nuestra tabla de partida, ahora vamos a generar tres variables en función de la variable tipo:
data datos2;
set datos;
precio_1 = (tipo = 1) * precio;
precio_2 = (tipo = 2) * precio;
precio_3 = (tipo = 3) * precio;
run;
Si vemos la tabla resultante tiene una forma de matriz con precios y ceros en función de la variable tipo. Ahora si sumarizamos esas variables y agrupamos por el id_cliente la forma de la tabla resultante es el objetivo deseado:
proc sql;
create table tdatos as select
id_cliente,
sum(precio_1) as precio_1,
sum(precio_2) as precio_2,
sum(precio_3) as precio_3
from datos2
group by 1;
quit;
Bien, pues esta es la “filosofía” de la trasposición con SAS en SQL. Pero esto lo podemos hacer en un solo paso:
proc sql;
create table tdatos as select
id_cliente,
sum((tipo=1)*precio) as precio_1,
sum((tipo=2)*precio) as precio_2,
sum((tipo=3)*precio) as precio_3
from datos
group by 1;
quit;
Y así podemos trasponer de forma sencilla en SAS sin emplear el PROC TRASPOSE que tiene alguna que otra limitación. Y por supuesto nos sirve para trasponer siempre que utilicemos SQL, con ORACLE, POSTGRES,… Creo que esta vez es muy sencillo de entender. Saludos.
wow! todo lo que veo por aquí esta de maravilla, muchas gracias.
en el caso de tener numero de cliente, y varios folios que corresponde a sus compras y otro campo donde viene el tipo de compra, si quiero transponer y dejar mi base a nivel cliente, donde solo me quede la variable transpuesta que es el tipo de compra y el resultado me de por cada cliente cuantas compras hizo por cada tipo de compra.
amigo y si quiero transponer dos filas .. en tu ejemplo solo transpones el precio, desearia que transpongas el tipo y precio.
SALUDOS