Trucos SAS. Trasponer con SQL para torpes

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: ...

21 de noviembre de 2011 · rvaquerizo

Trucos SAS. Validación de consultas con PROC SQL

Hay ocasiones en las que lanzamos consultas a las BBDD con SAS y necesitamos saber si son correctas. Quería plantearos un truco SAS para PROC SQL que valida las consultas antes de ser ejecutadas. Empiezo el truco en la línea habitual: creo un dataset de ejemplo y os presento cómo realizar la validación; de este modo, vosotros podéis copiar y pegar el código en una sesión de SAS y comprobar su funcionamiento. Datos aleatorios de partida: ...

6 de abril de 2011 · rvaquerizo

Uso de CASE en PROC SQL

Vamos a estudiar cómo funciona CASE en un PROC SQL. Son palabras que aparecen en las búsquedas de Google y también he observado que el número de visitas al blog ha descendido en los últimos días, y no sólo es debido a las vacaciones navideñas. El 60% de los clics a AyD vienen por temas de SAS y, en los últimos días, tengo muy olvidados los mensajes de esta categoría. Además, en el plazo de dos días voy a dejar de trabajar con esta herramienta, por lo que es posible que se reduzcan aún más. En fin, a lo que voy: CASE en el PROC SQL. ...

13 de enero de 2010 · rvaquerizo

Trucos SAS. Unión de múltiples tablas SAS con un nombre parecido

Ha llegado una búsqueda y ponemos el truco. Creo que ya lo puse, pero no está mal recordarlo. Creamos 20 datasets aleatorios con 10 observaciones cada uno: %macro doit; %do i = 1 %to 20; data zzdatos_&i.; do i = 1 to 10; output; end; run; %end; %mend; Un bucle fácil de macros ha generado 20 datasets que se llaman ZZDATOS_n. Recomiendo siempre emplear nombres «absurdos» para el trabajo con esta metodología. Empleamos un PROC SQL sobre la librería DICTIONARY, en concreto sobre la tabla tables. proc sql noprint; select memname into :lista_tablas separated by " " from dictionary.tables where index(memname, "ZZDATO") > 0; quit; Recordemos que en SASHELP tenemos vistas de estas tablas, el SEPARATED BY es el que indica que hacemos una selección múltiple. ...

7 de diciembre de 2009 · rvaquerizo

Trucos SAS. Identificar registros duplicados

Muy rápido: para identificar registros duplicados existen múltiples formas. Seguramente haré un monográfico sobre este tema, pero de momento dejo una píldora: data aleatorio; do i = 1 to 100000; id = ranpoi(23456, 56781); if ranuni(5) >= 0.3 then output; end; run; proc sql; create table repes (where=(rep > 1)) as select id, count(id) as rep from aleatorio group by id; quit; proc sql; create table no_repes (where=(rep = 1)) as select id, count(id) as rep from aleatorio group by id; quit; Contamos registros y empleamos WHERE como opción de escritura. Muy fácil y perfectamente entendible. No puedo entretenerme más, que mi hija me reclama…

29 de octubre de 2009 · rvaquerizo

Trucos SAS. Informes de valores missing

A continuación, os planteo como truco SAS una duda que nos mandaba Liliana. Ella necesitaba estudiar los valores perdidos de las tablas de una librería determinada. En este caso, vamos a estudiar los missing de las variables numéricas de una librería; de forma análoga se puede hacer con las alfanuméricas. Como siempre, vamos a trabajar con un ejemplo que parte de tablas generadas aleatoriamente. Comenzamos generando estas tablas: libname datos "C:\temp\datos"; %macro aleatorios; %do i = 1 %to 5; data datos.proyecto_&i.; do id = 1 to 200; if int(ranuni(0) * 10) = 2 then importe1 = .; else importe1 = round(rand("uniform") * 1000, .1); if int(ranuni(0) * 10) > 8 then importe2 = .; else importe2 = round(rand("uniform") * 130, .1); length zona $15; if ranuni(0) <= .32 then zona = "España"; else if ranuni(1) <= .32 then zona = "Cataluña"; else zona = "Resto"; output; end; run; %end; %mend aleatorios; %aleatorios; Con este programa generamos cinco datasets aleatorios con cuatro variables; dos de ellas son importes que tendrán valores missing en determinados casos. En este punto, hemos de crear un proceso que cuente valores perdidos; podemos emplear el PROC SQL o bien el PROC FREQ definiendo primero un formato. Empleamos FREQ para crear una macro: ...

16 de marzo de 2009 · rvaquerizo