Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Programação SAS
INCLUINDO:
1
ÍNDICE
2
Lição 20 – Instruções de Desvio (1): IF-THEN-ELSE ................................................ 31
IF com apenas um comando subordinado..................................................................... 31
IF com mais de um comando subordinado................................................................... 31
IF / ELSE IF / ELSE .................................................................................................... 31
Lição 21 – Operadores Lógicos e Relacionais ..............................................................32
Lição 22 –Operação de Data Subsetting....................................................................... 33
Lição 23 –Data Set Options............................................................................................ 34
KEEP............................................................................................................................. 34
DROP............................................................................................................................ 34
WHERE.........................................................................................................................35
RENAME...................................................................................................................... 35
Lição 24 – Funções do SAS............................................................................................. 36
Lição 25 – RETAIN......................................................................................................... 37
Lição 26 – LENGTH....................................................................................................... 38
Lição 27 – Instruções de Desvio (2): SELECT-WHEN............................................... 40
Lição 28 – Comando OUTPUT...................................................................................... 42
Lição 29 – Valores Lógicos............................................................................................. 42
Lição 30 – Valores do Tipo Data (Date)........................................................................ 42
Lição 31 – Valores do Tipo Data/Hora: TIME e DATETIME e Função DHMS...... 44
Lição 32 – Funções para Manipulação de Informações do Tipo Data/Hora............. 45
Lição 33 – Estruturas de Repetição (1): DO-WHILE .................................................47
Lição 34 – Estruturas de Repetição (2): DO ................................................................ 48
Lição 35 – Estruturas de Repetição (3): DO-UNTIL................................................... 49
Lição 36 – Program Data Vector (PDV)....................................................................... 50
EXEMPLO 2 – FUNCIONAMENTO DO PDV COM “VARIÁVEL RETAIN”....... 52
V. Conexão com Banco de Dados....................................................................................... 53
Lição 37 – Visão Geral do Método de Acesso à Bancos Relacionais no SAS ........... 53
Lição 38 – Conexão com o Oracle ................................................................................ 54
Lição 40 – Conexão com o DB2 .................................................................................... 55
Lição 39 – Conexão via ODBC (Exemplo DB2).......................................................... 55
Lição 41 – Conexão via ODBC (Exemplo PostGreSQL)........................................... 55
Lição 42 – Boa Prática: Criar um Nó para as Libraries............................................ 56
Lição 43 – PROC SQL – Introdução............................................................................ 56
Lição 44 – PROC SQL – Usando Funções SAS........................................................... 58
Lição 45 – PROC SQL – Criação de Data Sets SAS a Partir de uma Tabela ......... 59
Lição 46 – PROC SQL – Criação de Objetos no Banco Oracle..................................59
VI. Introdução às PROCs do SAS....................................................................................... 61
3
Lição 47 – O que é uma PROC?.................................................................................... 61
A Opção DATA............................................................................................................ 61
Lição 48 – PROC SORT ................................................................................................ 62
Lição 49 – BY VARIABLES, BY VALUES e BY GROUPS ......................................63
Lição 50 – PROC PRINT............................................................................................... 64
Lição 51 – PROC MEANS – Parte 1............................................................................. 65
Lição 52 – PROC MEANS – Parte 2............................................................................. 67
Lição 53 – PROC FREQ................................................................................................. 68
Lição 54 – Comentários Finais....................................................................................... 71
VII. Programação SAS – Além do Básico.......................................................................... 72
Lição 55 – SET................................................................................................................. 72
Lição 56 – Os Comandos KEEP, DROP, RENAME e WHERE................................ 73
Lição 57 – Variáveis Temporárias: FIRST e LAST.................................................... 73
Lição 58 – MERGE - Introdução................................................................................... 74
Lição 59 – MERGE – Exemplo Básico.......................................................................... 75
Lição 60 – MERGE - Como Funciona?.........................................................................78
Lição 61 – MERGE – Opção IN.....................................................................................82
Lição 62 – MERGE – Problemas mais Comuns........................................................... 83
Lição 63 – MERGE Sem BY.......................................................................................... 85
Lição 64 – MERGE x SQL JOIN...................................................................................86
Lição 65 – MODIFY - Introdução................................................................................. 86
Lição 66 – MODIFY com o Comando BY.................................................................... 87
Lição 67 – Arrays............................................................................................................ 90
Lição 68 – Macro Variáveis............................................................................................ 92
Lição 69 – Macro Variáveis Dinâmicas - CALL SYMPUT........................................ 94
Lição 70 – Macros ......................................................................................................... 95
Lição 71 – Macros – Como Funcionam?...................................................................... 97
Lição 72 – É o Fim!........................................................................................................ 98
Referências......................................................................................................................... 100
Anexo A – Data Set do Censo de Washington.................................................................. 102
4
I. Conhecendo o Sistema SAS
Este capítulo apresenta uma breve introdução à arquitetura SAS e descreve a
configuração do ambiente SAS no IBGE.
O sistema SAS pode ser definido como um ambiente de software completo para a
execução do processo de Business Intelligence (BI) nas empresas. Trata-se de um sistema
extremamente versátil, eficiente e poderoso, que é composto por diferentes módulos
especialmente direcionados para realizar o acesso, manipulação, integração e análise de
grandes bases de dados.
1
Em http://www.sas.com/presscenter/bgndr_history.html é possível encontrar outras informações sobre a
história do SAS.
2
Alguns anos depois a companhia retirou a palavra “Institute” de seu nome e passou a se chamar apenas SAS.
5
maneira separada pelas empresas, de acordo com as suas necessidades. As subseções a
seguir descrevem alguns dos pacotes do SAS.
BASE SAS
O “coração” do ambiente é o módulo Base SAS. Ele tem a finalidade principal de
oferecer funcionalidades para o acesso e transformação de dados, para a realização de
consultas ad-hoc e para a produção de relatórios em diversos formatos (PDF, HTML,
XML, RTF, XLS, entre outros). Além disso, o Base SAS pode ser utilizado para a
realização de diversos tipos de análise, desde a Estatística Descritiva simples (média,
variância, etc) até análise de freqüências e correlação. Todas essas tarefas são realizadas
com o uso de uma linguagem de programação denominada Linguagem SAS. Trata-se de
uma linguagem interpretada, dotada de recursos extremamente poderosos. A seguir são
relacionadas algumas de suas principais características:
SAS/ACCESS
O componentes Base SAS é extremamente flexível para a leitura de arquivos. Ele
possibilita o acesso a arquivos binários, hexadecimais, EBCDIC, ASCII e XML, entre
outros formatos. No entanto, o Base SAS não é capaz de acessar informações armazenadas
em bancos de dados relacionais; ele também não consegue lidar com arquivos MDB e XLS.
Para que isso seja possível é preciso que a empresa adquira uma ou mais interfaces
(drivers) SAS/ACCESS. Cada interface é licenciada de forma separada, ou seja, existe
uma interface SAS/ACCESS específica para Oracle, uma específica para DB2, etc. Duas
interfaces merecem comentários especiais. A primeira delas é a SAS ACCESS to PC File
Formats, utilizada para permitir a manipulação de arquivos MDB, XLS e outros formatos
comuns do PC. A outra é a SAS/ACCESS to ODBC, que permite que qualquer SGBD
possa ser acessado via ODBC em um programa SAS (ou seja, com esse produto instalado é
possível acessar o Oracle, DB2, SQL Server, PostgreSQL ou qualquer outro banco). A
6
Figura 1.1 apresenta um exemplo de utilização do SAS/ACCESS em uma empresa
hipotética.
Considere que o Sistema SAS da Figura 1.1 esteja instalado no ambiente Windows.
Observe que ele possui, além do módulo Base SAS (responsável pelo acesso a arquivos
texto), dois módulos SAS/ACCESS incorporados: SAS/ACCESS para Oracle (para acesso
ao SGBD Oracle) e SAS/ACCESS para ODBC (responsável pelo acesso aos SGBD’s
PostgreSQL e DB2). Embora o módulo SAS/ACCESS para ODBC também possa ser
utilizado com o banco Oracle, imagine que a empresa exemplo tenha preferido licenciar a
interface específica do Oracle, preocupada com questões relativas a desempenho no acesso
aos dados.
Após essa breve discussão, é possível concluir que o licenciamento de interfaces
SAS/ACCESS é algo praticamente obrigatório nas empresas. Afinal de contas, qual é a
empresa que, nos dias de hoje, não possui um SGBD relacional em operação?
SAS/STAT
Pacote que incorpora inúmeras procedures sofisticadas para análise estatística à
Linguagem SAS (regressão, análise multivariada, análise de dados categóricos, etc). É um
dos módulos mais importantes e populares do SAS (lembre-se de que as raízes do SAS
encontram-se na análise estatística!).
SAS/IML
Pacote de funções para a manipulação de matrizes.
SAS/ETS
Pacote de funções para Econometria e análise de Séries Temporais
7
IMPORTANTE: este não é um curso de Estatística e sim uma introdução à programação na
Linguagem SAS. Por este motivo, nenhuma das funcionalidades contidas nos pacotes SAS/STAT,
SAS/IML e SAS/ETS serão abordadas ao longo dos próximos capítulos.
SAS/GRAPH
Embora o componente Base SAS seja capaz de produzir diferentes tipos de gráficos,
novas funcionalidades para este fim podem ser acrescentadas com o licenciamento do
SAS/GRAPH;
SAS/GIS
Sistema de informações geográficas.
SAS/QC
Disponibiliza ferramentas de apoio ao controle de qualidade de processos de análise
estatística.
SAS/Connect
Pacote que torna possível a comunicação entre sessões SAS que estejam executando
em diferentes plataformas.
8
comunica com um Sistema SAS que esteja instalado em um computador remoto (Servidor
SAS). O EG utiliza componentes .NET para se comunicar com o módulo Integration
Technologies (SAS/IT) instalado em um Servidor SAS (ou seja, é preciso licenciar o
componente SAS/IT no servidor). A Figura 1.2 apresenta um esquema que ilustra a
comunicação entre um cliente EG dois servidores SAS.
9
Módulos Licenciados no Servidor SAS I (Windows)
Base SAS
SAS/IT
SAS/STAT
SAS/IML
SAS/ETS
SAS/QC
SAS/GRAPH
SAS/ACCESS to Oracle
SAS/ACCESS to ODBC
SAS/ACCESS to PC File Formats
Base SAS
SAS/IT
SAS/STAT
SAS/ACCESS to DB2
10
II. Introdução à Linguagem SAS
Um programa SAS é composto por uma seqüência de instruções submetidas ao
servidor SAS para interpretação e execução. Neste capítulo, os conceitos básicos sobre
programação em SAS serão apresentados.
Qualquer tipo de tarefa realizada no Enterprise Guide (EG) precisa ser organizada
em um projeto. Um projeto pode conter uma coleção de programas, logs, anotações,
tarefas, data sets e relatórios, entre outros objetos do SAS. Isto significa que, para que seja
possível criar um novo programa SAS é preciso, antes de tudo, criar um novo projeto ou
abrir um projeto existente no EG. Para criar um novo projeto basta executar uma das
seguintes ações:
- Se você já estiver com um projeto aberto, acessar o menu File / New / Project. No
EG, você pode ter apenas um projeto aberto de cada vez.
Uma tela similar à apresentada pela Figura 2.1 (tela principal do EG) será aberta.
11
servidores SAS da empresa. É preciso efetuar o login na rede Windows ou no MVS, para
que seja possível expandir as pastas dos servidores Windows e MVS, respectivamente.
2. Definição do Servidor SAS Default: O servidor SAS que será utilizado para a
maioria dos exercícios apresentados neste curso será o SERVIDOR I. Para definir
este servidor como o servidor SAS default, selecione a opção Administration /
Repository and Server. Selecione SERVIDOR I e clique em OK (Figura 2.3).
12
Figura 2.3 – Definição do Servidor SAS default
Basta realizar esta configuração uma única vez, para que ela seja utilizada em
qualquer novo projeto SAS a ser criado futuramente.
IMPORTANTE: este curso não objetiva ensinar a utilização do Enterprise Guide. Ao invés disso é
um curso de Linguagem SAS onde os programas serão escritos e executados no EG. Por
este motivo apenas as informações essenciais sobre este software serão apresentadas ao longo
das lições.
Leitores que desejarem conhecer detalhes sobre a utilização do Enterprise Guide poderão
consultar as seguintes referências: [Bennett 2008], [Slaughter e Delwiche 2006] e [Slaughter e
Delwiche 2008].
Esta lição tem o objetivo principal de demonstrar a forma como um programa pode
ser criado e executado no Enterprise Guide. Escreveremos um programa bem simples na
linguagem SAS, que irá criar um data set com a mensagem “Hello World!”. O programa
será executado no servidor SERVIDOR I (na rede de nossa empresa hipotética, suponha
que o nome dessa máquina seja S01). Para você criar o programa, siga as etapas descritas a
seguir:
1. Criar um nó do tipo código: Para acrescentar um programa a um projeto SAS é
necessário inserir um novo nó do tipo código no projeto. Isto pode ser feito
através do menu File / New / Code. Após executar esta ação, um ícone de código
será adicionado automaticamente à janela Project Explorer. Além disso, o editor de
código será disponibilizado (Figura 2.4).
13
Figura 2.4 – Nó do Tipo “Código” em um Projeto do Enteprise Guide
/*--------------------------------------------------------
Hello World - Meu primeiro programa SAS
---------------------------------------------------------*/
Este programa cria um data set SAS (tabela) chamado Hello, que contém apenas
uma variável (coluna), chamada MSG, e uma única observação (linha) com o valor
‘Hello World!’. Note que:
14
5. Examinando os Resultados: após a execução do programa, dois nós serão
acrescentados ao projeto, todos subordinados ao nó do código.
6. Salvando o Projeto: para salvar o projeto, clique em File / Save Project. Escolha a
opção Local Computer, para que o projeto seja gravado em sua estação de
trabalho. Conforme foi descrito na Lição 4, embora os programas sejam
executados no servidor SAS SERVIDOR I, eles devem ser gravados dentro dos
projetos, na estação do programador. Escolha uma pasta e salve o projeto com o
nome prjCapitulo1. Ele será gravado com a extensão *.egp (Enteprise Guide
Project).
O data set é o objeto utilizado pelo SAS para o armazenamento de dados. É similar
a uma tabela de um SGBD relacional, porém estruturada no formato interno do SAS. A
Figura 2.7 ilustra um data set que contém os dados oriundos do censo da cidade de
Washington, EUA (consulte o Anexo A para obter informações sobre este data set).
15
Figura 2.7 –Data Set com dados do Censo de Washington (1990)
IMPORTANTE: para que seja possível realizar a análise estatística, produzir relatórios ou
manipular dados com o uso dos comandos e procedures do SAS, primeiro é preciso importar os
dados que serão trabalhados para um data set.
Variáveis e Observações
No vocabulário SAS as linhas de uma data set são chamadas de observações e as
colunas são chamadas de variáveis.
Tipos de Dados
As variáveis de um data set suportam apenas dois tipos: numérico e caractere. As
variáveis numéricas podem ser positivas ou negativas, inteiras ou reais com qualquer
número de casas decimais. Elas são armazenadas na representação em ponto flutuante e
ocupam 8 bytes. No SAS um valor do tipo data/hora também é armazenado internamente
como um número. As variáveis do tipo caractere podem conter até 32767 caracteres. No
data set da Figura 2.7 existem duas variáveis numéricas (Age e HoursPerWeek) e quatro
variáveis caractere (Sex, Race, MaritalStatus e Education). Note que o EG usa ícones
diferentes para apresentar variáveis numéricas e caractere (Figura 2.7).
Valores Nulos
Um valor nulo em uma variável é chamado de missing no “vocabulário” SAS. Em
um data set SAS, as variáveis do tipo caractere representam um valor missing com um
espaço em branco, enquanto as variáveis numéricas representam o missing com um
ponto (“ . ”). Veja que na Figura 2.7 existem alguns valores missing para as variáveis Age e
Race.
16
Estrutura de um Data Set SAS
Além dos dados, um data set SAS também contém um descritor que armazena
informações sobre a estrutura do data set. Por exemplo: nome, data de criação, versão do
SAS em que o data set foi criado, propriedades das variáveis, etc.
Os data sets criados no SAS são gravados com a extensão *.sas7bdat no ambiente
Windows.
* Programa 2.2;
* cria a library CURSO;
* que corresponde ao repositório de dados do curso de SAS;
libname CURSO '\\CursoSAS';
3
Consulte o instrutor para saber o nome do compartilhamento utilizado em seu curso.
17
Figura 2.8 – Visualizando as Libnames em uma Sessão SAS
IMPORTANTE: Para que você possa acessar arquivos usando Programas SAS, é preciso que
estes estejam armazenados em algum compartilhamento de rede que possa ser enxergado pelo
seu login de rede. Caso o seu programa precise gravar dados, será preciso que o seu login possua
direito de gravação no compartilhamento.
Nos programas SAS, os SGBD’s relacionais também são enxergados como libraries, conforme
será discutido no Capítulo 5.
Todo programa SAS é construído a partir de apenas dois tipos de passos: DATA e
PROC. As instruções que compõem o programa são colocadas dentro de cada passo. O
esquema apresentado na Figura 2.9 - adaptado de [Garrido et al 1996] - ilustra o fluxo de
um programa SAS simples.
18
• No fluxo da Figura 2.9, o programa começa com o passo DATA que é responsável
pela criação de um data set SAS. O data set pode ser construído a partir de fontes
de dados distintas como, por exemplo, tabelas de SGBD’s relacionais e arquivos
texto.
• A seguir, o programa vai para o passo PROC, responsável pela análise do data set
dados e produção de relatórios.
Para que o conceito fique mais claro, digite e execute o seguinte programa:
DATA PAISES;
Todo passo DATA começa com a palavra reservada DATA seguida por um nome,
que representa o nome do data set que será produzido ao final da execução do passo (no
exemplo, PAISES). Normalmente os dados usados para montar um data set são obtidos
através de fontes externas. No entanto, no programa, o data set PAISES é populado com
dados internos (dados especificados no próprio código fonte), como o uso dos comandos:
CARDS e INPUT.
O comando INPUT é um dos mais importantes do SAS e será discutido com
detalhes no Capítulo III. No programa-exemplo ele foi utilizado com o propósito de
especificar as variáveis do data set PAISES. Estas variáveis são NOME, do tipo caractere
e POPULACAO do tipo numérico. O símbolo “ $ ” ao lado da palavra NOME indica ao
SAS que esta variável é do tipo caractere.
O comando DATALINES é usado para o lançamento das observações do data set.
Todas as linhas que forem encontradas após a palavra DATALINES serão consideradas como
novas observações até que o SAS encontre um ponto-e-vírgula (linha 9). Os valores de cada
19
variável devem ser separados com espaço em branco. O comando DATALINES não é muito
utilizado em aplicações práticas, pois normalmente os dados de um data set são montados a
partir de fontes externas. No entanto, ele costuma ser muito utilizado para fins didáticos
(em exemplos e manuais do SAS). Ele possui um comando equivalente (que funciona do
mesmo modo), chamado CARDS.
O comando RUN marca o fim do passo DATA. Um passo DATA ou PROC é
encerrado quando o SAS encontra um novo passo (marcado pelas palavras-chave DATA ou
PROC), quando o fim do programa é alcançado, ou quando o comando RUN é encontrado.
Apesar de não ser obrigatório, o comando RUN é muito utilizado porque melhora a
legibilidade do código e do log gerado. Após o final do passo DATA, inicia-se o passo
PROC, que é composto por apenas uma instrução:
PROC PRINT DATA=PAISES;
• Passo DATA
Começa com a palavra DATA.
É usado para leitura e modificação de dados, oriundos de fontes
diversas.
Cria um data set.
• Passo PROC
Começa com a palavra PROC.
É normalmente usado para invocar alguma procedure para análise de
dados do SAS.
Produz um conjunto de resultados ou um relatório.
IMPORTANTE: Na prática, nem sempre as diferenças entre os dois passos são tão claras e
rígidas. Existem situações onde é possível criar um data set dentro de um passo PROC ou gerar
relatórios dentro de um passo DATA!
20
IMPORTANTE: existem alguns comandos de configuração que devem ser especificados fora dos
passos DATA e PROC. Um exemplo é o comando LIBNAME.
WORK é uma library especial criada automaticamente pelo SAS sempre que uma
sessão é iniciada e destruída, também de forma automática, quando uma sessão encerrada.
Cada sessão SAS possui a sua library WORK associada.
Todo data set é criado dentro da WORK, caso nenhum outro local seja especificado
no código de um programa SAS. A Figura 2.10 ilustra esse fato: o data set PAISES, gerado
pelo programa da lição anterior, encontra-se armazenado nessa library.
Como a WORK é uma library temporária, todo conteúdo nela armazenado também
é excluído ao final de uma sessão SAS. De maneira mais clara, isto quer dizer que os data
sets da WORK também morrem no momento uma sessão SAS é finalizada! Se você
desejar persistir um data set, precisará criá-lo em outra library.
21
automaticamente um arquivo de log associado, que contém as linhas de código do
programa adicionadas de mensagens do SAS com relação ao status da execução.
No EG, um “nó de log” é acrescido a um código quando este é executado. A Figura
2.11 apresenta alguns trechos do log associado à execução do programa que gerou e
imprimiu o data set PAISES, apresentado na Lição 11.
...
14 * Programa 2.3: cria um data set e produz relatório a partir do mesmo
15
16 * Passo Data - cria data set;
17 DATA PAISES;
18
19 INPUT NOME $ POPULACAO;
20 CARDS;
24 ;
25 RUN;
26
27 * Passo PROC - gera relatório a partir do data set criado;
28 PROC PRINT DATA=PAISES;
29 RUN;
3 NOTE: There were 3 observations read from the data set WORK.PAISES.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.79 seconds
cpu time 0.01 seconds
...
43 QUIT; RUN;
44
Figura 2.11 – Arquivo de Log de um Programa SAS
Veja que o log inicia (1) com informações sobre a data e hora de execução do
programa. A seguir (2) apresenta informações a respeito do passo DATA que gerou o data
set PAISES: número de observações, variáveis e tempo de execução. A mesma coisa é feita
com relação à execução da PROC PRINT (3).
O comando put pode ser utilizado para escrever mensagens no log. Este é um
recurso útil no processo de depuração de programas.
DATA T_XY;
INPUT X Y;
PUT 'ISSO VAI SER ESCRITO TRÊS VEZES';
DATALINES;
1 11
2 12
3 13
;
RUN;
22
III. Manipulação de Arquivos
Este capítulo apresenta a maneira pela qual arquivos podem ser acessados e,
posteriormente, transformados em data sets SAS
4
Disponível em http://www.ibge.gov.br/concla/naturezajuridica/2003.php
23
INFILE e depois o nome do arquivo a ser acessado. A instrução aceita alguns parâmetros
que serão apresentados nas Lições 16 e 17.
Nas linhas 4-6 do programa, o comando INPUT é usado para determinar as variáveis
que farão parte do data set NATUREZA e indicar a forma pela qual elas podem ser obtidas
no arquivo de origem,. Existem várias maneiras de utilizar a instrução INPUT. No programa
exemplo desta seção, foi utilizada a seguinte sintaxe:
IMPORTANTE: o programa apresentado nesta seção funcionou corretamente pelo fato de que o
arquivo de entrada foi montado com um comprimento fixo para cada linha (84 caracteres, 4 para o
código da natureza e 80 para a sua descrição). As linhas onde a descrição da natureza jurídica
possui menos de 80 caracteres foram completadas com espaços em branco.
Este tipo de formato é comum no mainframe, mas nem sempre é utilizado no Windows. Na Lição
17 será demonstrada uma forma de abrir arquivos que não possuem comprimento fixo.
Você deve ter notado que, no exemplo anterior, não foi preciso programar nenhum
tipo de laço dentro do passo DATA para percorrer o arquivo texto e importar o seu
conteúdo para um data set SAS. Isto ocorre porque o passo DATA funciona baseado em
um laço implícito (built-in loop), ou seja, o loop que é executado de forma automática.
Esta é uma característica bastante inusitada, porém extremamente interessante da
Linguagem SAS, pois ela contribui decisivamente para que o código de um programa SAS
seja mais simples e curto do que o código produzido em outras linguagens. De agora em
diante, é importantíssimo que você memorize a regra apresentada na página a seguir:
Para que este conceito fique mais claro, observe o esquema apresentado na Figura
3.2 [Slaughter e Delwiche 2003]. Ela mostra como uma observação lida de um arquivo de
entrada é tratada dentro de um passo DATA.
24
Figura 3.2 – O laço implícito do passo DATA
DATA CEP;
INFILE '\\CursoSAS\CEP_RJ.CSV' DLM=',' DSD;
INPUT CEP_INICIAL CEP_FINAL COD_MUNIC NOME_MUNIC $;
RUN;
25
Após a importação você perceberá que o data set gerado possui um problema na
variável NOME_MUNIC. Todos os nomes são gerados com o comprimento fixo de 8
caracteres (Figura 3.4).
Esta situação ocorre porque o SAS, por default considera que o tamanho de uma
variável caractere é igual a 8. Para que o problema possa ser resolvido é preciso utilizar o
comando LENGTH para declarar a variável “grande” antes do INPUT.
DATA CEP;
INFILE '\\CursoSAS\CEP_RJ.CSV' DLM=',' DSD;
LENGTH NOME_MUN $ 50;
INPUT CEP_INICIAL CEP_FINAL COD_MUNIC NOME_MUNIC $;
RUN;
26
Lição 17 – Mais Opções para Leitura de Arquivos
DATA UFS;
INFILE '\\CursoSAS\ARQ_TAB.TXT' DLM='09'x DSD;
LENGTH UF $ 30;
INPUT SIGLA $ UF $;
RUN;
DATA NUMEROS;
INFILE '\\CursoSAS\ARQ_ESP.TXT';
INPUT N1 N2 N3;
RUN;
FIRSTOBS
Começa a leitura do arquivo a partir de uma linha específica.
DATA UFS;
INFILE '\\CursoSAS\ARQ_TAB.TXT' DLM='09'x DSD FIRSTOBS=5;
LENGTH UF $ 30;
INPUT SIGLA $ UF $;
RUN;
TRUNCOVER
A tentativa de ler um campo com tamanho que exceda o comprimento de uma
observação poderá fazer com que o SAS faça a leitura de forma errada. A opção
TRUNCOVER é usada para resolver este problema. Ela é especialmente útil quando se
deseja realizar a leitura de um arquivo separado por colunas que não possui comprimento
fixo.
DATA NATUREZA;
INFILE '\\CursoSAS\NJUR_NOTFIX.TXT' TRUNCOVER;
INPUT
@1 CODIGO 4.
@5 DESCRICAO $CHAR80.;
RUN;
LRECL
No ambiente Windows, o SAS assume que as linhas de um arquivo têm um
comprimento máximo de 256 caracteres. Caso seja preciso abrir um arquivo de entrada com
comprimento maior, é preciso usar a opção LRECL do comando INFILE. O exemplo a
27
seguir mostra a forma de utilizar a opção para ler o arquivo COMPRIDO.TXT, da Figura
3.6, que possui comprimento de 260 caracteres.
DATA COMPRIDO;
INFILE '\\CursoSAS\COMPRIDO.TXT' LRECL=260;
INPUT
@01 CODIGO 1.
@02 DESCRICAO $CHAR259.;
RUN;
IMPORTANTE: no ambiente Windows, a opção LRECL precisa ser usada para garantir a correta
leitura de arquivos com observações de comprimento superior a 256 caracteres.
INFORMATS: PD e ZD
Os INFORMATS são utilizados no comando INPUT para permitir a leitura de
dados em um formato que não seja padrão, como por exemplo números representados nos
formatos decimal compactado, decimal zonado, binário ou hexadecimal. Os dois primeiros
formatos costumam ser utilizados em ambiente mainframe5. A Tabela 3.1 apresenta indica
a sua forma de utilização.
28
Lição 18 – FILE e PUT: Comandos para Gravação de
Arquivos Texto
ATENÇÃO: não se esqueça que o comando PUT também é usado para escrever mensagens no
log.
29
IV. Transformação de Dados
Variáveis podem ser trabalhadas e transformadas dentro de um passo DATA antes
de terem o seu conteúdo gravado em um data set ou arquivo de saída. Este Capítulo
demonstra como operações deste tipo podem ser realizadas com a aplicação das instruções
de desvio condicional (IF-THEN-ELSE e SELECT) e das funções reservadas da
Linguagem SAS. O capítulo também um conceito muito importante associado à Linguagem
SAS: o Program Data Vector.
DATA MEDIAS;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
IMPORTANTE: neste exemplo o programador não foi obrigado a declarar as variáveis e seus tipos
no início do passo DATA. No entanto, na lição 25 será apresentado um exemplo de situação
prática onde isto é necessário.
30
Tabela 4.1 – Operadores Aritméticos e de String
Operador Função
+, -, /, * Adição, Subtração, Divisão e Multiplicação
** Exponenciação
|| Concatenação de Strings
IF / ELSE IF / ELSE
Condições podem ser logicamente agrupadas com o uso dos comandos ELSE IF e
ELSE.
31
DATA MEDIAS;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
/*
VERIFICA SE ALUNO FOI APROVADO
ELE SERÁ APROVADO SE A MÉDIA FOR MAIOR OU IGUAL A 6
OU SE TIVER MÉDIA MAIOR OU IGUAL A 4
E MÉDIA PONDERADA MAIOR OU IGUAL A 6
*/
32
Lição 22 –Operação de Data Subsetting
Considere que você deseje criar um data set SAS que contenha apenas um
subconjunto de observações de um arquivo de entrada. Por exemplo: apenas os alunos com
média acima de 6.0. Este processo é conhecido no mundo SAS como “subsetting”. Ele
também é realizado com a utilização da instrução IF, conforme mostra o programa a seguir:
DATA APROVADOS;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
Observe que o data set aprovados conterá apenas dois registros, com os dados dos
dois alunos que obtiveram a média superior à 6.0.
A sintaxe do comando para subsetting é (mais uma!) que a princípio parece bastante
esquisita. Afinal, qualquer programador que não conhece SAS observaria este programa e
pensaria: “se a média for maior ou igual a 6.0 então o quê??? Será que este IF não está
incompleto?!”. Porém, basta entender o funcionamento deste tipo de comando para que
você passe a achar o seu uso muito interessante. Afinal de contas, é mais um exemplo de
sintaxe que ajuda a tornar os programas SAS muito econômicos!
IF condição;
Funcionamento:
se for FALSA:
DATA APROVADOS;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
33
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
As data set options permitem com que o programador possa especificar ações
específicas enquanto um data set está sendo lido ou criado [Johnson 2003]. Elas são
especificadas entre parêntesis após o nome do data set.
KEEP
A opção KEEP é utilizada para permitir com que seja indicada a lista de variáveis
que serão gravadas no data set de saída. Se uma variável não estiver na lista ela não será
levada para o data set de saída.
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
A opção KEEP deve ser colocada entre parêntesis, seguida do sinal de igualdade. A
relação de variáveis a serem mantidas deve ser especificada utilizando um espaço em
branco como separador.
DROP
A opção DROP é utilizada com o mesmo propósito do KEEP. A diferença é que a
lista associada a essa opção indica as variáveis que não serão gravadas no data set de saída.
34
*o data set de saída conterá apenas as variáveis MATRICULA e MEDIA;
DATA MEDIAS_FINAIS (DROP = NOTA1 NOTA2);
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
WHERE
A opção WHERE é utilizada com o objetivo de realizar a operação de subsetting
(exclusão de observações). Uma observação será gravada no data set de saída apenas
quando a condição especificada na cláusula WHERE for verdadeira. No exemplo a seguir,
o data set APROVADOS conterá apenas as matrículas e médias finais dos alunos
aprovados. Observe que foi possível combinar as opções KEEP e WHERE.
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
RENAME
A opção RENAME pode ser utilizada para que mudar o nome de uma variável no
data set de saída. A mudança de nome ocorre apenas no momento em que a observação
está sendo gravada. Por este motivo, o programa deve referenciar os nomes antigos das
variáveis dentro do passo DATA.
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
* EXCLUI OS REPROVADOS;
IF MEDIA >= 6.0;
RUN;
35
Lição 24 – Funções do SAS
DATA NATJUR_PUB;
INFILE '\\CursoSAS\NJUR.TXT' LRECL=260;
INPUT
@1 CODIGO 4.
@5 DESCRICAO $CHAR256.;
IF substr(CODIGO,1,1) = '1';
RUN;
A Tabela 4.4 lista a definição e a sintaxe de algumas das principais funções do SAS.
36
TRIM Remove os brancos. X = length(' SAS ');
*retorna 'SAS';
SUBSTR Obtém uma substring a partir X = substr('BRASÍLIA',6,3);
de uma string. *retorna 'LIA';
UPCASE Converte uma string para X = upcase('brasília');
maiúsculo. *retorna 'BRASÍLIA';
LOWCASE Converte uma string para X = upcase('BRASÍLIA');
minúsculo. *retorna 'brasília';
A função input recebe como entrada uma variável caractere e retorna o seu valor
convertido para numérico. É preciso especificar no segundo argumento da função o número
de posições desejadas para o valor convertido.
A função put faz o contrário: recebe um número e converte para caractere.
Também é preciso especificar no segundo argumento o tamanho do valor de saída.
Lição 25 – RETAIN
DATA SEM_RETAIN;
CONTADOR = 0; *DECLARA “CONTADOR” E INICIALIZA COM ZERO;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
MEDIA = (NOTA1 + NOTA2) / 2;
CONTADOR = CONTADOR + 1;
RUN;
37
Veja que, no programa, a variável CONTADOR foi declarada no início do passo
DATA, recebendo o valor zero (assim o seu tipo foi automaticamente estabelecido como
numérico). Na última linha do passo DATA, incrementa-se à variável em uma unidade. No
entanto, isto não é suficiente para que as mudanças no valor de CONTADOR sejam
acumuladas entre os diferentes passos, conforme mostra a Figura 4.2.
O comando RETAIN pode ser utilizado para modificar este comportamento. Se uma
variável for declarada com o uso deste comando, seu valor ao final de uma iteração será
levado para a iteração seguinte. O programa a seguir demonstra o uso do RETAIN. A
Figura 4.3 mostra o data set produzido após a execução do programa.
DATA COM_RETAIN;
*DECLARA "CONTADOR" INICIANDO COM ZERO E USANDO O RETAIN;
RETAIN CONTADOR 0;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
MEDIA = (NOTA1 + NOTA2) / 2;
CONTADOR = CONTADOR + 1;
RUN;
IMPORTANTE: no exemplo, o comando RETAIN foi utilizado na primeira linha do passo DATA e a
variável declarada possuía um valor inicial especificado. No entanto, o SAS permite com que o
RETAIN seja utilizado em qualquer linha e também não requer a especificação de um valor inicial.
Lição 26 – LENGTH
38
Se você criar uma variável através de um comando de atribuição, o comprimento da
variável será determinado pelo valor da primeira ocorrência dela. Considere o seguinte
exemplo, que utiliza a base de dados TEMPERATURAS.TXT (Figura 4.4), que contém 5
datas e a temperatura máxima registrada em cada uma dessas datas.
01/04/2008 12
02/04/2008 28
03/04/2008 25
04/04/2008 32
05/04/2008 39
Figura 4.4 – TEMPERATURAS.TXT
DATA TEMPERATURAS;
INFILE '\\CursoSAS\TEMPERATURAS.TXT';
INPUT DATA $ 1-10 GRAUS_C;
IF GRAUS_C <= 20 THEN
CLASSE = 'FRIO';
ELSE IF GRAUS_C > 20 AND GRAUS_C <= 29 THEN
CLASSE = 'AGRADAVEL';
ELSE IF GRAUS_C > 29 AND GRAUS_C <= 34 THEN
CLASSE = 'CALOR';
ELSE
CLASSE = 'CALOR SENEGALÊS';
RUN;
DATA TEMPERATURAS;
INFILE '\\CursoSAS\TEMPERATURAS.TXT';
39
INPUT DATA $ 1-10 GRAUS_C;
SELECT <(variável)>;
WHEN1 (expressão1)
comandos1;
WHENn (expressãon)
comandosn;
OTHERWISE
comandoso;
END;
40
DATA UFS;
INFILE '\\CursoSAS\ARQ_TAB.TXT' DLM='09'x DSD;
LENGTH UF $ 30 REGIAO $ 12;
INPUT SIGLA $ UF $;
SELECT (SIGLA);
WHEN ('RJ','SP','MG','ES') REGIAO = 'SUDESTE';
WHEN ('RS','SC','PR') REGIAO = 'SUL';
WHEN ('GO','MS','MT','DF') REGIAO = 'CENTRO-OESTE';
WHEN ('RO','AC','AM','RR','PA','AP','TO') REGIAO = 'NORTE';
WHEN ('MA','PI','CE','RN','PB','PE','AL','SE','BA') REGIAO = 'NORDESTE';
OTHERWISE REGIAO = 'N/A';
END;
RUN;
É possível montar a estrutura SELECT-WHEN sem associar uma variável ao
SELECT. O exemplo a seguir demonstra esta característica. Trata-se do programa para
obtenção de classes de temperaturas (apresentado na Lição 26), agora modificado para
utilizar a estrutura SELECT-WHEN.
DATA TEMPERATURAS;
INFILE '\\CursoSAS\TEMPERATURAS.TXT';
INPUT DATA $ 1-10 GRAUS_C;
SELECT;
WHEN (GRAUS_C <= 20) CLASSE = 'FRIO';
WHEN (GRAUS_C > 20 AND GRAUS_C <=29) CLASSE = 'AGRADÁVEL';
WHEN (GRAUS_C > 29 AND GRAUS_C <=34) CLASSE = 'CALOR';
OTHERWISE CLASSE = 'CALOR SENEGALÊS';
END;
RUN;
Por fim, o próximo exemplo demonstra que é possível montar expressões compostas
por condições e variáveis distintas na cláusula WHEN. O exemplo também descreve o fluxo
de execução da estrutura SELECT-WHEN.
DATA EXEMPLO_2;
SALARIO=500; FILHOS=3;
SELECT;
WHEN (SALARIO <= 600 AND FILHOS > 1 ) SAL_FAMILIA= SALARIO * 0.20;
WHEN (FILHOS > 2) SAL_FAMILIA = SALARIO * 0.05;
OTHERWISE SAL_FAMILIA=0;
END;
RUN;
As variáveis SALARIO e FILHOS são avaliadas contra o primeiro WHEN. Note que o
resultado da avaliação é VERDADEIRO e, por isso, a instrução SAL_FAMILIA= SALARIO *
0.20 é executada. A seguir o controle do programa é automaticamente passado para o
primeiro comando depois do END; do SELECT (melhor explicando: o SELECT é
encerrado). Por esta razão a expressão WHEN (FILHOS > 2) não é avaliada pelo programa
exemplo.
41
Lição 28 – Comando OUTPUT
Normalmente o SAS adiciona uma observação ao data set de saída no final de cada
iteração do loop implícito do passo DATA. No entanto, é possível mudar este
comportamento com o uso do comando OUTPUT. Digite e execute o programa abaixo.
DATA ExemploOutput;
X=1; Y=2; Z = X * Y;
OUTPUT;
X=2; Y=2; Z = X * Y;
OUTPUT;
Como resultado da execução, será criado um data set com 3 observações. Cada
observação conterá valores diferentes para as variáveis X, Y, Z e K, que correspondem aos
valores armazenados nestas variáveis no momento anterior à execução do comando
OUTPUT. Note que o valor de K será missing nas duas primeiras observações.
Embora a Linguagem SAS não possua um tipo lógico (booleano), o tipo numérico
pode ser utilizado para representar valores VERDADEIRO ou FALSO. Quando uma
condição é avaliada por comandos como IF e WHILE o valor 0 (zero) é tratado como o
valor lógico FALSO e qualquer outro valor diferente de zero é tratado como
VERDADEIRO. Veja o exemplo a seguir. Ao final da execução as variáveis MSG1 e
MSG3 conterão o valor ‘ENTROU NESSE IF’, enquanto MSG2 permanecerá com o
conteúdo missing.
DATA LOGICO;
X=1; Y=0; Z=-999;
LENGTH MSG1 $ 30 MSG2 $ 30 MSG3 $ 30;
42
Lição 30 – Valores do Tipo Data (Date)
DATA ExemploData1;
INFILE '\\CursoSAS\TEMPERATURAS.TXT';
INPUT
@001 DIA DDMMYY10.
@012 GRAUS_C 2.;
RUN;
Figura 4.7 – A variável DIA foi importada com um INFORMAT de data, mas é armazenada como numérica
43
Figura 4.8 – Impressão da Variável DIA com o Formato “DD/MM/AAAA”
Uma relação abrangente de INFORMATS para a leitura de datas pode ser obtida em
[Slaughter e Delwiche 2003].
IMPORTANTE: em muitas situações práticas, você precisará ler uma variável do tipo data a partir
de um arquivo texto, mas na precisará realizar nenhum tipo de operação com esta variável. Neste
caso não existe qualquer problema em armazenar o valor desta data em uma variável caratere.
05/09/2007 02:25:45
01/01/2008 00:00:00
15/03/2008 19:30:04
Figura 4.9 – Arquivo “DATA_HORA.TXT”
44
em [Holland Numerics 2008]. A idéia é quebrar a informação em duas variáveis. Uma delas
recebe a porções DATE e outra a porção TIME. Em seguida a função DHMS pode ser
utilizada para combinar as duas porções em uma única variável do tipo DATETIME.
DATA ExemploData2;
INFILE '\\CursoSAS\DATA_HORA.TXT';
*PRIMEIRA ETAPA: LÊ PORÇÃO DATA E PORÇÃO HORA EM VARIÁVEIS SEPARADAS;
INPUT
@001 DIA DDMMYY10.
@012 HORA TIME8.;
Para utilizar a função DHMS com o intuito de unir uma variável DATE e uma
variável TIME em uma variável DATETIME deve ser especificada a seguinte sintaxe:
RESULTADO = DHMS(VAR_DATE,0,0,VAR_TIME);
45
DATA ExemploData3;
DATA ExemploData4;
*declara e inicializa duas variáveis do tipo DATE;
d1 = '01jan2007'd;
d2 = '15jan2008'd;
46
*função INTCK: permite a especificação de uma unidade de medida;
* para o intervalo a ser calculado;
d5 = INTCK('DAY ',d1,d2); *número de dias entre d1 e d2;
d6 = INTCK('WEEK ',d1,d2); *número de semanas entre d1 e d2;
d7 = INTCK('MONTH ',d1,d2); *número de meses entre d1 e d2;
RUN;
10
2
13
100
9
41
1000
1013
500
7
Figura 4.11 – Arquivo “NUMEROS.TXT”
47
PRIMO = 'NÃO';
LEAVE; *quebra o laço DO-WHILE na marra;
END; *{IF};
I = I + 1;
END; *{WHILE};
RUN;
DATA TABUADA_DE_MULTIPLICACAO;
DO N=1 to 9 by 1;
DO I = 1 to 9 by 1;
NxI = N*I;
OUTPUT;
END;
48
END;
RUN;
Este programa monta um data set que contém a tabuada completa de multiplicação
dos números de 1 a 9. Primeiro é montado um laço externo que varia N (variável de
controle) de 1 a 9. Dentro deste laço existe um outro laço que varia I entre 1 e 9.
Subordinado a este laço interno estão dois comandos. O primeiro cria a variável NxI. O
segundo é o comando OUTPUT para forçar a escrita de uma observação no data set de
saída. A sintaxe da estrutura é descrita a seguir:
A estrutura DO-UNTIL executa um grupo de comandos repetidas vezes até que uma
condição especificada seja VERDADEIRA. A condição é checada NO FINAL de cada
iteração do laço.
DATA ExemploUntil;
X = 1;
DO UNTIL(X < 10);
OUTPUT;
X = X + 1;
END;
RUN;
Quando se usa a estrutura DO-UNTIL, o laço é executado pelo menos uma vez, já
que a condição que mantém o laço é testada apenas no final. Por este motivo, o data set
produzido pelo programa acima conterá uma observação. A sintaxe do DO-UNTIL é
apresentada abaixo:
DO UNTIL (condição);
Comando1;
...
Comandon;
END;
49
Lição 36 – Program Data Vector (PDV)
O Program Data Vector (PDV) é um conceito lógico que existe para auxiliar os
programadores SAS. Ele pode ser imaginado um array em memória que contém todas as
variáveis criadas em um passo DATA. O PDV armazena os dados referentes a uma única
observação de cada vez (ou seja, a observação que está sendo processada na iteração
corrente). É a partir das informações do PDV que os data set são gravados, observação por
observação [Droogendyk 2008], [Johnson 2003].
Além das variáveis criadas no passo DATA, o PDV sempre contém duas variáveis
automáticas: _N_ e _ERROR_. A primeira armazena o número da iteração que está sendo
processada no momento, enquanto a segunda indica se um erro ocorreu durante o
processamento do passo DATA. Para melhor compreender o funcionamento do Program
Data Vector, serão apresentados dois exemplos.
DATA DUMMY;
INFILE '\\CursoSAS\ARQ_XY.TXT';
INPUT X Y;
Z = X * Y;
RUN;
2 9
5 10
20 3
Figura 4.13 – ARQ_XY.TXT
Observe que o laço automático do passo DATA deste programa realizará três
iterações quando executado. Examinaremos a forma pela qual o SAS preenche o PDV com
informações em cada uma das iterações.
50
X Y Z _N_ _ERROR_
X Y Z _N_ _ERROR_
2 9 18 1 0
Figura 4.15 – PDV no final da primeira iteração
X Y Z _N_ _ERROR_
5 10 50 2 0
Figura 4.16 – PDV no final da segunda iteração
X Y Z _N_ _ERROR_
20 3 60 3 0
Figura 4.17 – PDV no final da última iteração
51
ou PROC) a ser compilado e executado. Como o programa exemplo não possui nenhum
outro passo, a execução será encerrada.
9 2 9 1 0
Figura 4.18 – PDV no final da primeira iteração
Como sabemos, o PDV é usado para popular os data sets de saída. Neste exemplo
as variáveis ACUMULA_Y e X serão gravadas, mas Y não será levada para o data set
DUMMY2, pois faz parte da lista da opção DROP deste data set. Conclui-se então que:
todas as variáveis de um data set de saída sempre estão PDV, mas nem todas as
variáveis do PDV são gravadas no data set.
19 50 10 2 0
Figura 4.19 – PDV no final da segunda iteração
Resultado Final
A Figura 4.20 apresenta o conteúdo final do data set gerado pelo programa. Veja
que Y não faz parte do data set e que ACUMULA_Y é a sua primeira variável.
52
V. Conexão com Banco de Dados
Este capítulo descreve a forma utilizada para o acesso à banco de dados relacionais
nos programas SAS. A seção também introduz a PROC SQL, um recurso que permite com
que instruções na Linguagem SQL possam ser executadas dentro de programas SAS.
Libref
O parâmetro libref representa o nome pelo qual você irá referenciar a sua conexão
de banco de dados dentro dos programas SAS. Para que você possa acessar os objetos do
banco, precisará adicionar a libref como prefixo, seguida de um ponto (“ . ”). Por exemplo,
se a sua libref chama-se “libPNAD” e o banco possui uma tabela chamada
T_ESCOLARIDADE, você precisará acessar o objeto utilizando a sintaxe
libPNAD.T_ESCOLARIDADE.
Engine
No Sistema SAS, o acesso a bancos de dados relacionais é gerenciado através das
interfaces SAS/ACCESS (Lição 3). Na arquitetura exemplo apresentada na Figura 1.2
(Lições 4 e 5), existe a seguinte configuração: o Servidor I possui as interfaces Oracle (que
permite o acesso nativo ao SGBD Oracle) e ODBC (que permite o acesso ao PostgreSQL,
DB2 e outros bancos via ODBC). Já o Servidor II possui instalada a inteface DB2 (acesso
nativo ao DB2). No comando LIBNAME, o parâmetro engine é utilizado exatamente com o
objetivo de especificar a interface SAS que será utilizada na conexão. No ambiente
exemplo, existem apenas três possibilidades: oracle, db2 ou odbc.
Dados_da_conexão
Este parâmetro varia de acordo com o SGBD a ser acessado. Quando o acesso feito
ao banco Oracle, por exemplo, é necessário colocar o servidor (DIORADES, DIORAPRD,
etc), usuário e senha nos dados de conexão. Já em uma conexão ao DB2 pela interface
nativa (no MVS) é preciso especificar o banco (teste ou produção) e um ID com direito de
acesso.
As lições a seguir detalham a forma como o comando LIBNAME pode ser
configurado para o acesso a diversos bancos de dados.
53
Lição 38 – Conexão com o Oracle
Parâmetros:
• oracle: engine que especifica a utilização da interface nativa do Oracle.
• pw: senha.
Este comando cria uma conexão para o banco (usuário) “scott” no servidor
“oradesenv” (banco automaticamente instalado pelo Oracle). Após a execução do código,
acesse a janela de servidores (servers). Expanda o servidor de banco de dados e a pasta
Libraries. Observe que a library lib1 será apresentada. Ela possui as tabelas do banco de
dados CURSO_SAS. É possível examinar o conteúdo das tabelas e fazer uma cópia na
library WORK.
54
Lição 40 – Conexão com o DB2
Para os programas SAS executados no mainframe, a conexão com o DB2 poderá ser
feita através da interface nativa para este banco, desde que o ambiente possua o módulo
SAS ACCESS for DB2.
Onde authid refere-se a uma sigla de acesso ao MVS. Para informações sobre os
bancos de produção e desenvolvimento do DB2, consulte a equipe de suporte a este banco.
O banco de dados DB2 pode ser acessado via ODBC, caso a empresa possua o
módulo SAS ACCESS for ODBC.
Até o momento a SAS ainda não desenvolveu uma interface ACCESS para
PostgreSQL, porém o acesso pode ser feito utilizando a interface odbc. Para que seja
possível acessar o PostgreSQL via SAS, primeiro é necessário solicitar a criação de um
data source ODBC específico para o seu banco no servidor SAS. Tendo sido criado o
data source, utilize o seguinte comando:
55
Lição 42 – Boa Prática: Criar um Nó para as Libraries
Uma boa prática de programação que pode ser adotada em projetos do Enterprise
Guide, consiste em criar um nó de código apenas para manter a configuração das
libraries que serão utilizadas nos programas. Utilizaremos esta prática nos exercícios
apresentados neste capítulo. Para começar a implementá-la, siga os passos abaixo:
PROC SQL;
Instrução_SQL1;
...
Instrução_SQLn;
QUIT;
RUN;
56
PROC SQL;
SELECT * FROM lib1.EMP;
QUIT;
RUN;
Este programa gera um relatório HTML contendo todos os dados da tabela EMP.
Note que é preciso especificar a libref “libP1” antes da tabela, para informar ao SAS a
localização da mesma.
IMPORTANTE: um comando SELECT dentro de uma PROC SQL serve para a geração de um
relatório (funcionamento similar ao da PROC PRINT).
O programa a seguir realiza o SELECT sobre o data set CENSO, que está
localizado na library libCurso. A instrução SELECT obtém a idade, raça, escolaridade e
classe de renda de todas as mulheres entrevistadas pelo Censo de Washington.
PROC SQL;
SELECT Age, Race, Education, IncomeClass FROM libCurso.CENSO
WHERE sex = 'Female';
QUIT;
RUN;
PROC SQL;
SELECT D.COD_DOMICILIO, P.COD_PESSOA,
D.QTD_DORMITORIOS,
V.DSC_VALOR_DOMIC,
D.SGL_UF,
E.DSC_ESCOLARIDADE,
P.NUM_ANO_NASC
FROM
libPNAD.T_DOMICILIO_PNAD D
INNER JOIN libPNAD.T_VALOR_DOMICILIO V
ON (D.COD_VALOR_DOMIC = V.COD_VALOR_DOMIC)
INNER JOIN libPNAD.T_PESSOA_PNAD P
ON (D.COD_DOMICILIO = P.COD_DOMICILIO)
LEFT JOIN libPNAD.T_ESCOLARIDADE E
ON (P.COD_ESCOLARIDADE = E.COD_ESCOLARIDADE)
WHERE D.SGL_UF = 'GO'
AND V.DSC_VALOR_DOMIC NOT LIKE 'IGNORADO'
ORDER BY 3 DESC, 1, 2;
QUIT;
RUN;
57
Lição 44 – PROC SQL – Usando Funções SAS
A PROC SQL suporta apenas o SQL ANSI. Não é possível utilizar funções
específicas do Oracle (DECODE, TO_CHAR, TO_NUMBER, TO_DATE, NVL, etc). O
SELECT abaixo falha porque houve uma tentativa de calcular a idade da pessoa
entrevistada com o uso da função TO_NUMBER (mensagem de erro no LOG: ERROR:
Function TO_NUMBER could not be located).
PROC SQL;
SELECT D.COD_DOMICILIO, P.COD_PESSOA,
D.QTD_DORMITORIOS,
V.DSC_VALOR_DOMIC,
D.SGL_UF,
E.DSC_ESCOLARIDADE,
P.NUM_ANO_NASC,
2002 – TO_NUMBER(P.NUM_ANO_NASC) AS IDADE_EM_2002
FROM
libPNAD.T_DOMICILIO_PNAD D
INNER JOIN libPNAD.T_VALOR_DOMICILIO V
ON (D.COD_VALOR_DOMIC = V.COD_VALOR_DOMIC)
INNER JOIN libPNAD.T_PESSOA_PNAD P
ON (D.COD_DOMICILIO = P.COD_DOMICILIO)
LEFT JOIN libPNAD.T_ESCOLARIDADE E
ON (P.COD_ESCOLARIDADE = E.COD_ESCOLARIDADE)
WHERE D.SGL_UF = 'GO'
AND V.DSC_VALOR_DOMIC NOT LIKE 'IGNORADO'
ORDER BY 3 DESC, 1, 2;
QUIT;
RUN;
Felizmente existem duas formas de resolver esta situação. A forma mais simples é
utilizar uma função SAS dentro do comando SQL. A função SAS que realiza a conversão
de uma string para number é a input. Basta utilizá-la no SQL que o comando funcionará
normalmente.
PROC SQL;
SELECT D.COD_DOMICILIO, P.COD_PESSOA,
D.QTD_DORMITORIOS,
V.DSC_VALOR_DOMIC,
D.SGL_UF,
E.DSC_ESCOLARIDADE,
P.NUM_ANO_NASC,
2002 – input(P.NUM_ANO_NASC, 4.) AS IDADE_EM_2002
FROM
libPNAD.T_DOMICILIO_PNAD D
INNER JOIN libPNAD.T_VALOR_DOMICILIO V
ON (D.COD_VALOR_DOMIC = V.COD_VALOR_DOMIC)
INNER JOIN libPNAD.T_PESSOA_PNAD P
ON (D.COD_DOMICILIO = P.COD_DOMICILIO)
LEFT JOIN libPNAD.T_ESCOLARIDADE E
ON (P.COD_ESCOLARIDADE = E.COD_ESCOLARIDADE)
WHERE D.SGL_UF = 'GO'
AND V.DSC_VALOR_DOMIC NOT LIKE 'IGNORADO'
ORDER BY 3 DESC, 1, 2;
QUIT;
58
RUN;
Uma das aplicações mais populares da PROC SQL consiste na criação de data sets
SAS. Um comando CREATE AS SELECT pode ser utilizado para criar um data set na área
de WORK (ou em qualquer outra library SAS).
No exemplo a seguir, a tabela T_DOMICILIO_PNAD (da library libPNAD) será
criada e populada na área de WORK do SAS. Já a tabela DEPT (de libSCOTT) será criada
como um data set SAS na libCURSO.
IMPORTANTE: se você criar um data set sem utilizar uma libname no prefixo, ele será criado
na library WORK. Isto é válido tanto para data sets criados em um passo DATA, como para os
criados pela PROC SQL.
No exemplo a seguir, uma tabela inteira do banco SCOTT (Oracle mainframe) será
copiada para o banco CURSO_SAS (Oracle Windows) com o uso da PROC SQL. Veja
como o processo é simples, mesmo as duas tabelas estando em ambientes diferentes.
59
*cria a tabela T_EMP_NEW em libPNAD;
PROC SQL;
CREATE TABLE libPNAD.T_EMP_NEW AS
SELECT * FROM lib1.EMP;
QUIT;
RUN;
60
VI. Introdução às PROCs do SAS
Em capítulos anteriores já demonstramos a utilização das PROCs PRINT e SQL do
SAS. No entanto, o conceito de PROC ainda não foi discutido com maiores detalhes. Este
capítulo tem os objetivos de apresentar as principais características do passo PROC e
também introduzir algumas das PROCs mais utilizadas em programas SAS.
Qualquer programa SAS é composto por apenas dois tipos de passo: DATA e
PROC. O passo PROC é o local onde podemos fazer a chamada a uma procedure do SAS.
A maioria dessas procedures tem o propósito de realizar algum tipo de análise sobre os
dados de um data set e produzir relatórios. No entanto, existem algumas procedures
capazes de alterar o conteúdo de um data set e, até mesmo, criar novos data sets (como é o
caso da recém-apresentada PROC SQL).
PROC xyz
DATA = _________________________
BY _________________________
TITLE __________________________________________________________
FORMAT __________________________________________________________
A Opção DATA
Esta opção, disponível em praticamente todas as PROCs, informa ao SAS que data
set será utilizado como entrada para a procedure. No exemplo a seguir a PROC PRINT
utiliza o data set chamado CNAE_20:
61
PROC PRINT DATA = CNAE_20;
O parâmetro DATA é opcional. Se for omitido o SAS utilizará o último data set
criado.
ATENÇÃO: o último data set criado não significa o último data set utilizado no programa.
A PROC SORT tem o propósito de realizar a ordenação de um data set por uma ou
mais variáveis. Esta é uma das PROCs mais importantes do SAS, pois as operações de
junção (MERGE) e modificação (MODIFY) de data sets requerem que eles estejam
ordenados. Além disso, existem diversas procedures para análise de dados que podem tirar
proveito do fato dos dados de entrada estarem ordenados para que possam produzir
relatórios segmentados ou agrupados por determinadas variáveis. A sintaxe básica da
PROC SORT é:
DATA CLIENTES;
INPUT NOME $ IDADE;
DATALINES;
MARIA 33
ANA 18
PEDRO 45
MARIA 33
CARLA 29
ROBERTO 50
AMANDA 28
;
RUN;
62
Figura 6.2 – Data Set Pessoas
A opção OUT pode ser usada para especificar a saída para um outro data set. Se
você modificar o programa anterior de acordo com o código apresentado abaixo verificará
que o data set PESSOAS não estará ordenado por nome e que será gerado um outro data
set chamado PESSOAS_ORD, este sim ordenado.
A opção NODUPKEY pode ser utilizada para eliminar registros duplicados (o caso
de “MARIA”). Já a cláusula DESCENDING pode ser utilizada junto ao comando BY para
que a ordenação seja realizada na forma descendente.
Se for preciso ordenar por mais de uma variável, basta especificá-las utilizando o
espaço como separador. No exemplo abaixo, a ordenação está sendo realizada
prioritariamente pela variável V1 (ascendente), depois por V2 (também ascendente) e, por
fim, por V3 na ordem descendente.
63
Figura 6.3 – BY VARIABLE, BY GROUPS e BY VALUES
No Enterprise Guide a saída pode ser gerada como HTML, PDF, RTF e outros
formatos. O programa a seguir gera um relatório a partir do arquivo NOTAS.TXT.
DATA RESULTADO;
INFILE '\\CursoSAS\NOTAS.TXT';
INPUT MATRICULA $ 1-8 NOTA1 NOTA2;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
IMPORTANTE: o comando TITLE depois da PROC PRINT faz com que o SAS coloque o texto
entre aspas no topo de cada página do relatório de saída. É muito importante saber que o
comando TITLE é um comando global que, na realidade, não faz parte de nenhum passo. Se
você não especificar um título para um relatório, o SAS utilizará o último valor atribuído para o
comando TITLE em sua sessão.
64
Lição 51 – PROC MEANS – Parte 1
Esta procedure computa a média, variância, desvio padrão e outras estatísticas sobre
variáveis numéricas de um data set. Sua sintaxe mais comum é dada por:
Onde:
Agora será feita uma demonstração da utilização da PROC MEANS. Considere uma
empresa hipotética que realiza apresentações sobre as linguagens Java, C# e PHP. A
empresa promove de 3 a 5 apresentações por mês. As palestras sobre cada linguagem são
realizadas no mesmo horário por três professores diferentes. O arquivo PALESTRAS.TXT
(Figura 6.4) apresenta a audiência de todas as palestras realizadas nos meses de fevereiro,
março e abril de 2008. Neste arquivo, a primeira informação é o dia do evento, seguido da
quantidade de pessoas que assistiram às palestras de C#, Java e PHP, respectivamente.
Note que no dia 22/03 não houve palestra sobre PHP.
01/02/2008 80 78 82
13/02/2008 102 72 96
25/02/2008 100 79 115
08/03/2008 87 87 79
15/03/2008 97 70 78
22/03/2008 109 81 .
30/03/2008 90 78 79
Figura 6.4 – PALESTRAS.TXT
Considere que a empresa deseja obter estatísticas de audiência por mês. Para
resolver este problema, ela poderia utilizar o seguinte programa SAS.
INPUT
@01 DIA DDMMYY10.
65
@12 C 3.
@16 JAVA 3.
@20 PHP 3.
;
NUM_MES = MONTH(DIA);
SELECT (NUM_MES);
WHEN (1) MES = 'JANEIRO';
WHEN (2) MES = 'FEVEREIRO';
WHEN (3) MES = 'MARÇO';
WHEN (4) MES = 'ABRIL';
WHEN (5) MES = 'MAIO';
WHEN (6) MES = 'JUNHO';
WHEN (7) MES = 'JULHO';
WHEN (8) MES = 'AGOSTO';
WHEN (9) MES = 'SETEMBRO';
WHEN (10) MES = 'OUTUBRO';
WHEN (11) MES = 'NOVEMBRO';
WHEN (12) MES = 'DEZEMBRO';
END;
RUN;
66
Figura 6.5 – Relatório produzido pela PROC MEANS
No exemplo da Lição 51, a PROC MEANS calculou, para cada variável, o número
de valores não nulos, a média, desvio padrão, valor máximo e valor mínimo. Isso ocorreu
porque a procedure foi chamada sem nenhuma opção. Em [Slaughter e Delwiche 2003]
uma lista de opções para o cálculo de outras medidas de interesse é apresentada. Algumas
delas são relacionadas na Tabela 6.1.
67
PROC MEANS DATA=PALESTRAS N NMISS SUM;
BY MES;
VAR C JAVA PHP;
TITLE 'ESTATÍSTICAS DAS PALESTRAS';
RUN;
68
PROC FREQ DATA = nome_do_dataset;
TABLES conjunto_de_variáveis1;
...
TABLES conjunto_de_variáveisn;
O próximo exemplo gera uma tabela de freqüência com o cruzamento das variáveis
Sex e IncomeClass (análise bidimensional) O resultado é apresentado na Figura 6.8.
69
Figura 6.8– Análise bidimensional com a PROC FREQ
70
inconveniente, que consiste na dificuldade da realização da análise visual de uma tabela
com 3 ou mais dimensões.
Este capítulo apresentou algumas das PROCs mais importantes do módulo Base
SAS. Existem muitas outras PROC úteis dentro do Base SAS, como a PROC COMPARE
(realiza a comparação de dois data sets), a PROC APPEND (insere observações em um
data set), a PROC CONTENTS (gera um relatório com as propriedades de um data set),
PROC FORMAT (permite a criação de formatos para relatórios), entre outras. Somando
estas procedures com aquelas que fazem parte dos módulos SAS/STAT, SAS/IML e
SAS/GRAPH temos centenas de PROCs disponíveis no ambiente SAS. Infelizmente a
apresentação de todas essas PROCs encontra-se fora do escopo deste curso.
71
VII. Programação SAS – Além do Básico
Este capítulo aborda os comandos utilizados para a modificação e combinação de
data sets, o uso de vetores (arrays) no passo DATA e também as funcionalidades de macro
do SAS.
Lição 55 – SET
O comando SET permite com que você leia um data set SAS, podendo modificá-lo
de diversas formas (adicionando ou eliminando variáveis, alterando o conteúdo, etc). A
sintaxe básica deste comando é a seguinte:
DATA novo_data_set;
SET data_set;
DATA CENSO_AUX;
LENGTH FAIXA_ETARIA $ 6;
SET libCurso.CENSO;
SELECT;
WHEN (Age <= 20) FAIXA_ETARIA = '<20';
WHEN (Age > 20 AND Age <=30) FAIXA_ETARIA = '21-30';
WHEN (Age > 30 AND Age <=40) FAIXA_ETARIA = '31-40';
WHEN (Age > 40 AND Age <=50) FAIXA_ETARIA = '41-50';
OTHERWISE FAIXA_ETARIA = '>50';
END;
RUN;
DATA CENSO_AUX2;
SET CENSO_AUX (KEEP=Age, Sex, Race);
RUN;
A utilização do comando SET com a opção KEEP (ou DROP) apresenta uma
grande vantagem no que diz respeito ao desempenho, pois impede que variáveis sejam
lidas para o Program Data Vector [Johnson 2003] o que gera economia de memória e
processamento.
72
IMPORTANTE: o número de iterações executados pelo laço automático de um passo DATA será
igual ao número de observações do data set indicado pelo comando SET.
* CALCULA A MÉDIA;
MEDIA = (NOTA1 + NOTA2) / 2;
RUN;
73
T_EMPREGO_PNAD - que possui informações sobre os salários das pessoas
entrevistadas pela PNAD. As variáveis FISRT e LAST são utilizadas para facilitar a
criação de uma variável derivada que armazenará a renda total de um domicílio (somatório
da renda de todos os moradores).
retain RENDA_TOT;
IMPORTANTE: para que as variáveis FIRST e LAST possam ser usadas dentro de um passo
DATA é preciso:
74
1. Ordenar os data sets pela variável em comum, caso eles não
estejam ordenados. Para isto, utilize a PROC SORT.
Figura 7.1 – Passos para a implementação de uma rotina de MERGE em um Programa SAS
DATA ds_saída;
MERGE d1 d2;
BY variáveis_em_comum;
Nesta lição será apresentada a operação de MERGE entre um data set com dados de
EMPRESAS e um data set com os dados das UL’s destas empresas. Os data sets serão
montados a partir dos arquivos EMPRESAS.TXT e ULS.TXT, cujos conteúdos são
apresentados nas Figuras 7.2 e 7.3, respectivamente.
75
222222220001RIO DO OURO I 1531920
222222220002RIO DO OURO II 153355
222222220003RIO DO OURO III 1540815
333333330001LOJA RIO DE JANEIRO 478148
333333330002LOJA NITERÓI 478144
444444440001SEDE ADMINISTRATIVA 70107112
444444440003LOJA PRINCIPAL 47113101
444444440004LOJA RECIFE 4711348
444444440005LOJA PORTO ALEGRE 4711350
444444440010LOJA VITÓRIA 47113
555555550001 861011800
666666660001LIMPSERV 8111712
Figura 7.3 – ULS.TXT
76
/*-------------------------------------------------------
MERGE - EXEMPLO 1 (BÁSICO);
PRODUZ O DATA SET "TODAS" RESULTANTE DO MERGE ENTRE UM
DATA SET DE EMPRESAS E UM DATA SET DE UL'S
-------------------------------------------------------*/
O programa será agora analisado. O primeiro passo cria um data set EMPS com
dados oriundos do arquivo EMPRESAS.TXT. De maneira análoga, no segundo passo o
data set ULS é criado a partir de ULS.TXT.
O objetivo é realizar o MERGE utilizando a variável Raiz que é a variável comum
entre os dois data sets. Para que o MERGE possa ser feito, é preciso que os data sets
estejam ordenados por esta variável em comum. Por este motivo, nos passos 3 e 4
utilizamos a PROC SORT. Se você observar a Figura 7.3, perceberá que o arquivo de UL’s
já estava ordenado. De qualquer maneira, foi feita a chamada da PROC SORT para as ULS
Se o conteúdo de ULS.TXT for alterado no futuro, o funcionamento do programa SAS
continuará garantido.
O quinto e último passo do programa é o que, de fato, cria o data set TODAS
resultante do MERGE entre os data sets EMPS e ULS. As tabelas a serem combinadas são
77
especificadas ao lado do comando MERGE, enquanto a variável em comum é indicada ao
lado do comando BY.
O data set TODAS possui 13 observações e 5 variáveis, conforme mostra a Figura
7.4.
Veja que as empresas com Raiz do CNPJ igual “11111111” e “88888888” não
possuem UL’s associadas, mas mesmo assim foram gravadas no data set (o SAS executou
algo semelhante ao que seria um LEFT JOIN na Linguagem SQL). Você entenderá porque
isso aconteceu ao estudar a próxima lição.
EMPRESAS ULS
RAIZ RAZÃO RAIZ SUFIXO UF
22222222 Emp A 22222222 0001 RJ
77777777 Emp B 22222222 0002 SP
88888888 Emp C 77777777 0001 MG
99999999 Emp D 99999999 0010 RJ
Figura 7.5 – Data Sets que serão Combinados com o MERGE.
78
Os dois data sets já estão ordenados pela variável comum, RAIZ. Recordando a
lição anterior, os comandos necessários para a efetivação do MERGE são:
DATA RESULTADO;
MERGE EMPRESAS ULS;
BY RAIZ;
RUN;
A simulação do processo de execução deste trecho de código pelo SAS é
apresentada a seguir.
1. Criação do PDV
Após a compilação do código, o SAS criará o PDV mostrado na Figura 7.6. Observe
que o PDV contém todas variáveis dos data sets EMPRESAS e ULS. Note ainda que a
variável comum RAIZ aparece apenas uma vez no PDV.
22222222 Emp A 1 0
Figura 7.7 – PDV após a leitura da primeira observação de EMPRESAS
O SAS irá ler agora a primeira observação que pertencente ao mesmo BY GROUP
em ULS. O valor da RAIZ será sobrescrito no PDV. Os valores das variáveis SUFIXO e
UF, que pertencem ao data set ULS serão preenchidos no PDV. O valor da Razão não será
alterado, pois essa variável não faz parte do data set ULS. Ao final do processo o PDV
estará configurado da maneira mostrada na Figura 7.8.
79
1. Manter o conteúdo das variáveis do PDV (exceto as variáveis automáticas). Veja
que este comportamento é diferente do comportamento padrão do PDV,
apresentado na Lição 36.
2. Não realizar a leitura de uma nova observação em EMPRESAS.
3. Realizar a leitura de uma nova observação em ULS, alterando o conteúdo das
variáveis RAIZ, SUFIXO e UF.
3 0
Figura 7.10 – PDV no Início da Terceira Iteração
4 0
Figura 7.12 – PDV no Início da Quarta Iteração
80
A próxima observação de EMPRESAS é lida, atualizando as variáveis RAIZ e
RAZÃO no PDV. Esta observação pertence ao BY GROUP (RAIZ = “88888888”). A
seguir, o SAS verifica se a próxima observação em ULS está associada ao mesmo BY
GROUP. A comparação retorna FALSE e por isso o SAS não importa a observação de
ULS. O PDV fica configurado da forma apresentada na Figura 7.13. Veja que SUFIXO e
UF ficam com valor missing. Estes serão os dados gravados no data set RESULTADO.
88888888 Emp C 4 0
Figura 7.13 – PDV ao final da quarta iteração.
DATA EMPRESAS;
INPUT RAIZ $ RAZAO $;
DATALINES;
22222222 EmpA
77777777 EmpB
88888888 EmpC
99999999 EmpD
RUN;
DATA ULS;
INPUT RAIZ $ SUFIXO $ UF $;
DATALINES;
22222222 0001 RJ
22222222 0002 SP
77777777 0001 MG
99999999 0010 RJ
RUN;
81
DATA RESULTADO;
MERGE EMPRESAS ULS;
BY RAIZ;
RUN;
Quando dois data sets são combinados, é possível utilizar a opção IN para
acompanhar qual o data set origem que contribuiu para a criação de cada observação no
data set de saída. A opção IN pode ser imaginada como uma espécie de etiqueta de
fabricação [Slaughter e Delwiche 2003]. Para que o conceito fique claro, altere a rotina de
MERGE do programa da Lição 59 da forma mostrada a seguir e, depois, execute
novamente o programa.
82
Esta alteração fará com que apenas as observações geradas somente pelo data set
EMPS sejam gravadas na saída (Figura 7.17). Estas observações correspondem às empresas
que não possuem UL’s.
IF E AND U THEN
OUTPUT COM_ULS; *este data set contém apenas as empresas com UL(s);
ELSE IF E AND NOT U THEN
OUTPUT SEM_ULS; *este data set contém apenas as empresas sem UL;
RUN;
Esta lição apresenta uma relação dos problemas mais comumente vivenciados pelos
programadores SAS com relação ao uso do comando MERGE com BY.
83
Data Sets com OBSERVAÇÕES DUPLICADAS afetam o Data Set de Saída
Se você combinar data sets que possuem observações duplicadas, estas serão
transportadas para o data set de saída. Observe o exemplo da Figura 7.18
RAZOES RECEITAS
RAIZ RAZÃO RAIZ CLASSE RECEITA
22222222 Emp X 22222222 A
22222222 Emp X 88888888 C
88888888 Emp Y
Figura 7.18 – Data Sets que serão Combinados com o MERGE
Considere que se deseja combinar o data set RAZOES (que possui o CNPJ e a razão
social das empresas) com o data set de receitas (que possui o CNPJ e a classe de receita).
Imagine que por um erro provocado em outro programa, o data set de RAZOES possui
uma observação duplicada, a de CNPJ = 22222222. O resultado do MERGE entre os dois
arquivos acabaria por levar o registro duplicado, conforme mostra a Figura 7.19.
RESULTADO
RAIZ RAZÃO CLASSE RECEITA
22222222 Emp X A
22222222 Emp X A
88888888 Emp Y C
Figura 7.19 – Data Sets com observação duplicada
DATA UM;
INPUT ID $ X;
DATALINES;
a 1
b 2
c 3
;
RUN;
DATA DOIS;
INPUT ID $ X;
DATALINES;
a 11
b 22
c 33
;
RUN;
DATA COMUM;
MERGE UM DOIS; BY ID;
RUN;
Uma variável comum aparecerá apenas uma vez no data set de saída. No exemplo
acima, o data set UM irá popular o PDV primeiro com os conteúdos de ID e X. Como o
data set DOIS possui observações do mesmo BY GROUP, o conteúdo de ID e o conteúdo
84
de X serão sobrescritos. No resultado final, acabarão prevalecendo as informações do data
set DOIS, já que ele foi o especificado por último na lista do MERGE (Figura 7.19).
DATA UM;
INPUT X;
DATALINES;
1
2
3
;
RUN;
DATA DOIS;
INPUT NOME $;
DATALINES;
EDUARDO
ANA
;
RUN;
DATA SEM_BY;
MERGE UM DOIS;
RUN;
85
Figura 7.20 – Data Set SEM_BY
CONTRAS - É preciso ordenar o data set por - Não é possível utilizar os recursos de
alguma variável BY. programação do DATA STEP.
86
DATA libCURSO.F_XY;
INPUT K X;
Y = K * X;
DATALINES;
5 10
5 20
5 30
;
RUN;
Imagine que o usuário deixou o data set F_XY gravado por alguns dias e depois
resolveu recriá-lo, fazendo uma modificação no valor de K (K passou a valer 5.5 ao invés
de 5). Ele poderia executar esta tarefa da seguinte maneira:
DATA libCURSO.F_XY;
SET libCurso.F_XY;
K = 5.5;
Y = K * X;
RUN;
Ao executar o programa, o SAS lerá cada observação de F_XY para o PDV. As
modificações em K e Y serão feitas no PDV e, os dados serão sempre gravados em um
data set temporário. Após a última iteração do passo DATA, o SAS substituirá o data set
F_XY pelo data set temporário.
Com o uso do MODIFY o processo de atualização é diferente, pois o SAS
modificará diretamente o data set, sem criar nenhuma estrutura temporária. Com isto
a atualização torna-se mais eficiente.
DATA libCURSO.F_XY;
MODIFY libCurso.F_XY;
K = 5.8;
Y = K * X;
RUN;
Existem 4 formas de usar o comando MODIFY: sozinho, com o comando BY, com
chave (key) e com o comando POINT. Nesta lição abordaremos a utilização do MODIFY
com o comando BY, por ser a que possui maior aplicação prática .
O uso do MODIFY com BY é similar ao do MERGE. Dois data sets ordenados por
uma ou mais variáveis são combinados. A diferença é que, neste caso, teremos a
combinação entre um data set de transações com um data set alvo (ou master). O data set
alvo tem o conteúdo modificado pelo de transações.
Durante o confronto entre os data sets será preciso utilizar um destes três
“comandos de ação” (action statements):
- OUTPUT: cria uma nova observação no data set alvo, a partir de uma observação
do data set de transações.
- REPLACE: atualiza uma observação no data set alvo, com os dados de uma
observação do data set de transações.
- REMOVE: exclui uma observação no data set alvo.
87
O próximo exemplo mostra um programa que usa o comando MODIFY, para alterar
um data set com dados de empresas a partir de um data set de transações. Os
comentários sobre o funcionamento do programa são apresentados logo em seguida.
Os dois primeiros passos do programa são bem simples: no primeiro cria-se o data
set alvo (EMP_ALVO) e no segundo o data set de transações que será usado para alterá-lo.
A seguir os dois data sets são ordenados por CNPJ.
O quinto passo é o que é realmente interessante, pois contém o comando MODIFY
responsável por alterar o conteúdo de EMP_ALVO. A instrução MODIFY EMP_ALVO
EMP_TRANS diz ao SAS que EMP_ALVO será modificado por EMP_TRANS. O MODIFY
requer que os data sets sejam indicados nessa ordem, primeiro o master e depois o data set
de transações. A instrução BY CNPJ, indica que a variável CNPJ será utilizada como chave
de comparação.
A seguir é montado um SELECT que avalia o valor da variável _IORC_
(Input/Output Return Code) que é outra variável automática do passo DATA (assim como
88
_N_ e _ERROR_). Ela contém um valor numérico que indica o status da última ação de
entrada/saída executada. O SAS disponibiliza a macro %SYSRC para converter este valor
numérico para um mnemônico mais fácil de ser memorizado pelo programador. A Tabela
7.2 relaciona os códigos e seus mnemônicos.
89
O LOG do SAS mostra a quantidade de registros inseridos, excluídos e atualizados
(Figura 7.22).
NOTE: The data set WORK.EMP_ALVO has been updated. There were 2
observations rewritten, 1 observations added and 0 observations
deleted.
Figura 7.22 – Log do SAS
Lição 67 – Arrays
M10,JOÃO,12000.55,12400.98,15999.99,13300.21,13800.12,9200.00
M11,PAULO,15111.12,15232.15,11100.15,12380.00,12322.15,17812.15
M13,ANTONIO,9000.00,12800.35,13500.35,10200.00,10800.13,11999.99
Figura 7.23 – Arquivo “VENDAS.TXT”
Considere um programa que será utilizado para calcular o salário a ser pago para
cada vendedor. A seguinte regra será utilizada: todo vendedor ganha R$ 480,00 somados ao
valor de uma comissão. Se o valor das vendas de um produto for inferior à 12000 reais, o
vendedor recebe comissão de 2% referente ao produto em questão, caso contrário a
comissão é de 3%. O programa SAS a seguir gera um data set com os valores das
comissões para cada vendedor, utilizando um array no processo de cálculo.
DATA FOLHA_SALARIAL (KEEP = MATRICULA NOME SALARIO);
90
*ETAPA 2 - DECLARAÇÃO DO ARRAY “VENDAS”;
array VENDAS{6} VENDAPROD1-VENDAPROD6;
DO i = 1 to 6;
IF VENDAS{i} < 12000 THEN
COMISSAO = COMISSAO + VENDAS{i} * 0.02;
ELSE
COMISSAO = COMISSAO + VENDAS{i} * 0.03;
END;
RUN;
91
acumulando os resultados na variável COMISSAO. O data set produzido pelo programa é
apresentado na Figura 7.25 (veja que o comando FORMAT, outra novidade desta lição, faz
com que o valor dos salários seja exibido de uma forma mais elegante).
Onde:
• {N} : determina o número de elementos do array. Também é possível
usar ( ) ou [ ].
As variáveis criadas em um passo DATA possuem escopo local. Isto quer dizer que
as variáveis “nascem” e “morrem” dentro do passo em que foram declaradas e, por isso,
não podem ter o seu conteúdo levado para um passo DATA ou PROC subseqüente.
Felizmente, a linguagem SAS dispõe de um recurso chamado macro variável para
contornar este problema. Resumidamente, pode-se dizer que uma macro variável é uma
estrutura que possui as seguintes características:
• Possui escopo global, ou seja, pode ser enxergada por qualquer passo DATA ou
PROC de um programa.
• Possui o nome prefixado por &.
Alguns exemplos:
92
%LET PI = 3.14;
%LET EMPRESA = Universidade Federal Fluminense;
Observe que não é necessário utilizar aspas para representar um valor que possui
espaços (isso só é requerido quando o valor possui espaços em branco à esquerda).
Todo programa que possui uma macro variável ou uma macro (ver lição 68) possui
um passo adicional de compilação, executado pelo macro processador do SAS
[Slaughter e Delwiche 2003], [SAS Macro 1997]. Antes do SAS compilar e executar cada
passo do programa, ele passa todos os processamentos de macro para o macro processador.
Este, por sua vez, “resolve” as macros, transformando-as em código SAS. Melhor
explicando: o que o processador SAS faz é, simplesmente, substituir, dentro do código de
um passo (DATA ou PROC), as referências a uma macro pelo texto que estiver a ela
associado (ex: antes de compilar o SAS troca todas as referências de &PI por 3.14). É por
este motivo que os manuais de referência dizem que “uma variável macro é sempre do tipo
caractere” (na verdade ela armazena um texto que será usado para substituir referências,
mesmo que esse texto seja um número como 3.14!). A seguir um exemplo que mostra a
aplicação de macro variáveis.
%LET PI = 3.14;
%LET CALC1 = ÁREA DO CÍRCULO;
%LET CALC2 = VOLUME DA ESFERA;
*monta data set com área do círculo de raios entre 1 e 10;
DATA CIRCULO;
DO raio=1 to 10 by 1;
area = &PI * (raio ** 2);
msg = "&CALC1 DE RAIO " || PUT(raio,2.);
OUTPUT;
END;
RUN;
*monta data set com volume da esfera de raios entre 1 e 10;
DATA ESFERA;
DO raio=1 to 10 by 1;
area = 4/3 * &PI * (raio ** 3);
msg = "&CALC2 DE RAIO " || PUT(raio,2.);
OUTPUT;
END;
RUN;
Inicialmente são declaradas três macro variáveis fora dos passos DATA do
programa. O objetivo é utilizá-las como constantes ao longo do programa. No processo de
compilação de cada passo, desta vez haverá uma etapa inicial feita pelo macro
processador, para substituir as referências às macros pelos seus valores. Melhor explicando:
antes da compilação do passo DATA CIRCULO (primeiro passo DATA do programa), o
macro processador substituirá as referências às variáveis &PI, &CALC1 pelos valores 3.14
e ÁREA DO CÍRCULO, respectivamente. Depois disso é que o passo DATA CIRCULO
será, de fato, compilado e executado pelo SAS. A seguir a mesma coisa será feita com
relação ao passo DATA ESFERA (segundo passo DATA do programa). Primeiro o macro
processador substituirá as referências às variáveis variáveis &PI, &CALC2 pelos valores
3.14 e VOLUME DA ESFERA, respectivamente. Então compilará e executará o passo
DATA ESFERA. O resultado é apresentado nas Figuras 7.26 e 7.27.
93
Figura 7.26 – Data set CIRCULO
IMPORTANTE: não esqueça que as referências às macro variáveis são sempre resolvidas pelo
processador de macros antes da execução de um passo DATA ou PROC.
No exemplo anterior as macro variáveis foram declaradas fora dos passos DATA e
utilizadas como constantes. No entanto, uma aplicação bem mais interessante para as macro
variáveis é feita pela rotina CALL SYMPUT. Esta rotina cria uma variável macro
dinamicamente, ou seja, a partir do valor de uma variável declarada dentro de um passo
DATA. Com isso, torna-se possível transferir informações de um passo DATA para
outro. A sintaxe da rotina CALL SYMPUT é apresentada a seguir:
Veja que o nome da macro variável a ser criada deve estar entre aspas. No
parâmetro valor, podemos especificar tanto uma constante literal, um número ou uma
variável do passo DATA. O próximo exemplo demonstra o uso da rotina CALL SYMPUT.
A explicação encontra-se no próprio código do programa. A Figura 7.25 apresenta o
resultado da execução.
94
*CRIA O DATA SET COM NOME E SALARIO DE EMPREGADOS;
DATA EMPREGADOS;
INPUT NOME $ 1-10 SALARIO;
DATALINES;
J.LENNON 1500
B.MARLEY 500
C.BERRY 5000
J.PAGE 3000
J.STRUMMER 2500
;
RUN;
Lição 70 – Macros
Uma macro do SAS é um trecho de código que aceita parâmetros (de entrada e
saída), pode ser armazenado em um arquivo em separado e compartilhado por diversos
programas SAS. Ou seja, uma macro é o recurso do SAS que permite a reutilização de
código.
As macros parecem um pouco com as sub-rotinas do Visual Basic ou as procedures
da Linguagem Pascal. No entanto a maneira com que o SAS compila e executa as macros é
completamente diferente do processo usado nestas linguagens. Na realidade os SAS faz
com as macros a mesma coisa que faz com as macro variáveis: usa o macro processador
95
para substituir o texto da macro por código SAS antes de compilar e executar um passo
DATA ou PROC. A sintaxe para a declaração de macros é apresentada a seguir:
*este passo DATA usa a macro ConvTemp para gerar tabela de equivalência;
*de valores de temperatura em graus Celsius e Fahrenheit;
DATA TABELA_TEMPERATURAS;
DO Celsius=-100 TO 100 BY 10;
%ConvTemp(Celsius, Fahrenheit);
OUTPUT;
END;
RUN;
96
Algumas considerações importantes. Dentro do código da macro, os parâmetros
devem ser referenciados com o uso do caractere & antes de seu nome (no exemplo &C e
&F). Para que a macro possa ser usada, é preciso chamá-la, no passo DATA ou PROC
utilizando o caractere % (no exemplo, %ConvTemp(Celsius, Fahrenheit))
Para que isto fique mais claro, apresentaremos um exemplo “etapa-por-etapa”, que
explica o processo de execução do passo DATA do programa abaixo (é o mesmo
apresentado na lição anterior).
DATA TABELA_TEMPERATURAS;
DO Celsius=-100 TO 100 BY 10;
%ConvTemp(Celsius, Fahrenheit);
OUTPUT;
END;
RUN;
DATA TABELA_TEMPERATURAS;
DO Celsius=-100 TO 100 BY 10;
Fahrenheit = Celsius * 1.8 + 32;
OUTPUT;
END;
97
A partir desse ponto o SAS compila e executa o programa da maneira que já foi
descrita no Capítulo 4, utilizando o PDV normalmente.
Uma característica muito interessante de uma macro consiste na possibilidade de
criar bibliotecas de macros. Uma macro pode ser armazenada em um arquivo e usada por
diversos programas. Para que um programa possa fazer uso de uma macro genérica, basta
utilizar o comando %INCLUDE. Exemplo:
%include '\\CursoSAS\macros\calc_dv.sas';
Lição 72 – É o Fim!
• SAS Global Forum: congresso anual que objetiva a troca de experiências entre
usuários SAS e a produção de artigos sobre diversos temas relacionados ao
produto. Alguns exemplos: artigos sobre o uso do comando MODIFY,
comparações entre a PROC SQL e o MERGE, uso do Enterprise Guide,
aplicações do SAS em diversas áreas, etc. A cada ano são produzidos mais de
200 artigos. Anteriormente a conferência era chamada de SUGI. O link do SAS
Global Fórum disponibiliza gratuitamente todos os artigos publicados desde a
conferência de 1997 (SUGI 22). http://support.sas.com/events/sasglobalforum/
98
• SAS Technical Papers: fornecem detalhes técnicos sobre como você pode
executar uma tarefa. Dentre as várias categorias de papers existe uma dedicada
inteiramente ao Base SAS. Link para acesso:
http://support.sas.com/resources/papers/index.html
99
Referências
Bennett, P. (2008), “Starting Out With SAS Enterprise Guide”, SAS Global Forum 2008
Proceedings, Paper 169-2008, San Antonio.
Droogendyk, Ian (2008), “Joining DATA: Data Step Merge or SQL?”, SAS Global Forum
2008 Proceedings, Paper 178-2008, San Antonio.
Fernandez, George (2002), “Data Mining using SAS applications”, CRC Press.
Galster, Dwight (2006), “SAS Tutorial”, Dept. of Math and Statistics, South Dakota State
University, disponível em http://learn.sdstate.edu/Dwight_Galster/.
Holland, Philip R. (2007), “Saving Time and Money Using SAS”. SAS Press.
Holland Numerics Limited (2008), “Frequent Asked Questions about SAS Software”,
disponível em http://www.hollandnumerics.co.uk/sasfaq/SASFAQ1.HTM.
Howard, Neil (2004), “How SAS Thinks or Why the DATA Step Does What it Does”,
SUGI 29 Proceedings, Paper 252-29, Montreal.
Hu, Weiming (2004), “Top Ten Reasons to Use PROC SQL”, SUGI 29 Proceedings,
Paper 042-29, Montreal.
Johnson, Jim (2003), “The Use and Abuse of the Program Data Vector”, MISUG 2003
Proceedings, disponível em http://www.misug.org/mifolder/JJohnson_PDV.pdf.
Lauderdale, Kirsty (2007), “PROC SQL – The Dark Side of SAS?”, SAS Global Forum
2007 Proceedings, Paper 071-2007, San Antonio.
Mack, Curtis (2006), “Improve Database Transaction Processing Using MODIFY, the
Most Under-Appreciated Data Step File Handling Statement”, SUGI 31 Proceedings, Paper
264-31, Califórnia.
SAS Macro (1997), “SAS Macro Language: Reference, First Edition”. SAS Press.
Slaughter, Susan J. e Delwiche, Lora D. (2003), “The Little SAS Book: a Primer”. 3a
Edição, SAS Press.
100
Slaughter, Susan J. e Delwiche, Lora D. (2006), “The Little SAS Book for Enterprise
Guide 4.1”. SAS Press.
Stroupe, Jane (2007), “Adventures in Arrays: a Beginning Tutorial”, SAS Global Forum
2007 Proceedings, Paper 273-2007, San Antonio.
TS-644 (2000), “Everything You Wanted to Know about Merge but Were Afraid to Ask”.
SAS Technical Support, TS-DOCS, TS-664.
TS-668 (2001), “SAS Dates, Times, and Interval Functions”. SAS Technical Support, TS-
DOCS, TS-668.
TS-705 (2004), “The Fundamentals of MERGE”. SAS Technical Support, TS-DOCS, TS-
705.
Whitlock, Ian (2007), “How to Think Through the SAS Data Step”, SAS Global Forum
2007 Proceedings, Paper 208-2007, Orlando.
101
Anexo A – Data Set do Censo de Washington
A base do Censo de Washington – também conhecida como adult database ou
census income data set – encontra-se disponibilizada para download no repositório de
bancos de dados da Universidade da Califórnia7. Trata-se de um arquivo seqüencial no
formato texto que contém dados provenientes do censo que foi realizado no ano de 1990,
na cidade de Washington nos Estados Unidos. O arquivo foi transformado em um data set
SAS para utilização em nosso curso.
Cada observação apresenta informações relativas a um indivíduo entrevistado pelo
censo. O arquivo é composto por 30.162 registros, extraídos de maneira aleatória da base
de dados original do censo. Para cada pessoa entrevistada, são apresentados dados a
respeito de 9 variáveis, que indicam, entre outras características, a idade, educação, estado
civil e tipo de ocupação de cada pessoa. Além disso, existe uma variável chamada
IncomeClass que é utilizada para especificar se o entrevistado possui renda anual superior a
US$ 50.000,00. A descrição do arquivo é apresentada a seguir. As variáveis Age e
HoursPerWeek são numéricas e as demais do tipo caractere.
7
UCI Machine Learning Repository - http://mlearn.ics.uci.edu/MLRepository.html
102
ATRIBUTO DESCRIÇÃO CONJUNTO DE VALORES
POSSÍVEIS PARA O ATRIBUTO
Bachelors
Doctorate
HS-grad
Masters
Preschool
Prof-school
Some-college
103
ATRIBUTO DESCRIÇÃO CONJUNTO DE VALORES
POSSÍVEIS PARA O ATRIBUTO
Mexico
Nicaragua
Outlying-US(Guam-USVI-etc)
Peru
Philippines
Poland
Portugal
Puerto-Rico
Scotland
South
Taiwan
Thailand
Trinadad&Tobago
United-States
Vietnam
Yugoslavia
IncomeClass Renda Anual <=50K
(igual ou inferior a US$ 50.000,00)
> 50K
(superior a US$ 50.000,00)
104