Noções básicas de programação SAS Base. Lição 4. Criando conjuntos de dados SAS

Em um artigo anterior , aprendemos a ler dados brutos externos. Hoje vamos nos familiarizar com o operador SET, que lê conjuntos de dados SAS padrão (SAS Data Set), aprendemos a criar fatias de dados, configurar atributos persistentes e também aprender algumas funções úteis do SAS. Mais uma vez, tentarei apresentar o material na linguagem mais simples possível, usando o maior número possível de exemplos.



Digamos que os dados sejam armazenados no formato EXCEL no diretório C: \ workshop \ habrahabr . Importamos a planilha, criamos uma fatia, criamos novas colunas calculadas usando as funções SAS e, em seguida, dividimos esse conjunto de dados em dois.

Importar uma planilha e definir um filtro



O arquivo do Excel é armazenado no diretório acima e tem a seguinte aparência:

Snippet de arquivo:


Aplicamos o procedimento PROC IMPORT para converter uma planilha em um conjunto de dados SAS:

options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company replace; getnames=yes; run; 

A opção validvarname = V7 define os nomes de campo corretos do ponto de vista do SAS: substitui todos os caracteres inválidos por sublinhados. As regras para nomear variáveis ​​podem ser encontradas na Lição 1.

Definimos o filtro imediatamente ao ler um arquivo externo; por exemplo, selecionamos apenas as observações nas quais a data final não está faltando. Observe a sintaxe do parâmetro where.

 options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company (where=(End_Date not is missing)) replace; getnames=yes; run; 

Vamos considerar em detalhes os operadores da etapa PROC IMPORT:

Arquivo de dados - define o caminho completo e o nome do arquivo externo
Dbms - Define o tipo de dados a ser importado.
Out - identifica o conjunto de dados de saída SAS com um nome de SAS de um ou dois níveis (nome da biblioteca e nome do conjunto de dados).
Substituir - substitui um conjunto de dados SAS existente.
Getnames - indica se PROC IMPORT gera nomes de variáveis ​​SAS a partir dos valores de dados na primeira linha do arquivo externo de entrada.

Execute a etapa PROC IMPORT e examine o LOG:


Imprima o conjunto de dados SAS resultante:

 proc print data=work.company noobs; run; 

A saída do procedimento PROC PRINT é mostrada abaixo:

Fragmento:


Também no SAS UE, você pode usar a guia Resultados para visualizar o conjunto de dados SAS importado.


Lendo conjuntos de dados SAS



A leitura do conjunto de dados SAS é implementada na etapa DATA usando a instrução SET :

Considere a sintaxe geral da instrução SET:

 SET<SAS-data-set(s) <(data-set-options(s) )> > <options>; 

Se você não especificar um conjunto de dados na instrução SET, ele lerá as observações do último conjunto de dados SAS criado.

Na instrução SET, você pode especificar vários conjuntos de dados; nesse caso, os Conjuntos de Dados SAS serão adicionados um sob o outro (semelhante ao UNION no SQL).

Além disso, na etapa DATA, pode haver duas instruções SET; nesse caso, as tabelas são unidas por uma coluna comum. Você pode ler mais sobre as duas instruções SET neste artigo , por exemplo.

O código mais simples para criar uma cópia do conjunto de dados SAS é o seguinte:

 data company1; set company; run; 

Configurando um Descritor de Conjunto de Dados SAS


Você pode examinar o descritor do conjunto de dados SAS usando o procedimento PROC CONTENTS ( consulte Lição 2 ). Neste tutorial, imprimiremos o componente descritor usando o procedimento PROC DATASETS :

 proc datasets library=work nolist; contents data=company order=varnum; quit; 

Um fragmento dos resultados:


Defina um formato constante para as variáveis ​​Travel_Expenses e Budget:

 data company; set company; format Travel_Expenses Budget dollar10.2; run; 

Verifique os atributos dos conjuntos de dados SAS:

 proc datasets library=work nolist; contents data=company order=varnum; quit; 


Criando colunas calculadas


Todas as funções do SAS podem ser exploradas no SAS 9.4 Functions and CALL Routines: Reference, Fifth Edition .

Além disso, se não houver uma função adequada para executar uma tarefa específica, você poderá usar o procedimento PROC FCMP e criar sua própria função.

Nesta lição, exploraremos as três funções YRDIF, SUM e CATS.

Para calcular a diferença de datas em anos, usaremos a função YRDIF .

Deixe-me lembrá-lo de que uma data no formato SAS é o número de dias a partir de 01 de janeiro de 1960 ( consulte Lição 1 ). Nos dados apresentados, precisamos calcular o tempo de execução:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); format Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Observe que, usando o formato 3.1 para a variável Lead_Time, arredondamos os valores calculados no relatório (!) Para 1 casa decimal. O operador de formato não altera o valor no conjunto de dados SAS!

Um fragmento dos resultados:


Em seguida, calculamos o custo do trabalho sem despesas de viagem:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Um fragmento dos resultados:


Como parte de nossa tarefa, calculamos o custo do trabalho sem levar em conta as despesas de viagem sem usar a função. Não há valores ausentes em nossa tabela. Se uma das variáveis ​​(Orçamento ou Despesas de viagem) tiver um valor ausente, o resultado será “missão”.

Por exemplo:

Crie um conjunto de dados de teste:

 data test; input Budget Travel_Expenses; datalines; 12345 233 . 345 12543 . ; 

Calcular a diferença nas variáveis ​​Budget Travel_Expenses

 data test; set test; value=Budget-Travel_Expenses; run; 

O resultado desta etapa:


Para obter o resultado correto, você pode usar a função SUM .

Esta função pertence à categoria de funções estatísticas descritivas . As funções de estatística descritiva ignoram os valores ausentes.

Escrevendo código via SUM:

 data test; set test; value=sum(Budget,-Travel_Expenses); run; 

Nesse caso, o resultado da etapa é o seguinte:


A terceira coluna calculada é o endereço de e-mail do gerente. Ele pode ser "montado" nas colunas Manager_FirstName, Manager_LastName e nos valores habr .com

Você pode usar a função CATS para combinar valores de texto em uma linha.

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Um fragmento dos resultados:


Vamos examinar o descritor do conjunto de dados criado:

 proc contents data=work.company1 varnum; run; 

Lidar com fragmento:


Preste atenção ao comprimento da variável Email. É de 200 bytes; esse é o tamanho padrão retornado pela função CATS. Se examinarmos os atributos das variáveis ​​Manager_FirstName e Manager_LastName, podemos garantir que o comprimento da string 8 + 6 + '@ habr.com' seja suficiente para a variável Email, ou seja, outros 9 bytes, no total 23. Por que devo prestar atenção a isso? Todos os caracteres ausentes alcançam espaços, o que afeta o tamanho do conjunto de dados e afetará o desempenho em grandes quantidades de dados.

Para definir explicitamente o comprimento da variável Email, você deve usar o operador LENGTH:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Manipular fragmento


Crie uma coluna detalhada com base na variável Lead_Time, levando em consideração as seguintes condições:

  1. Se o valor da variável Lead_Time for menor que 1, a coluna Detalhe terá um valor menor que 1 ano.
  2. Se o valor da variável Lead_Time estiver no intervalo de 1 a 2, incluindo as bordas, a coluna Detalhe terá um valor de 1-2 anos.
  3. Se o valor da variável Lead_Time estiver no intervalo de 2 a 3, excluindo 2, a coluna Detalhes terá um valor de 2 a 3 anos.
  4. Se o valor da variável Lead_Time estiver no intervalo de 3 a 4, excluindo 3, a coluna Detalhe terá um valor de 3-4 anos.
  5. Se o valor da variável Lead_Time estiver no intervalo de 4 a 5, excluindo 4, a coluna Detalhe terá um valor de 4-5 anos.
  6. Em todos os outros casos, a coluna Detalhes tem o valor acima de 5 anos.

Você pode criar uma coluna detalhada de várias maneiras, por exemplo, a opção mais simples e mais óbvia é usar o processamento condicional. Pode ser implementado usando os seguintes operadores:

  1. IF-THEN-ELSE
  2. ELSE SE
  3. SELECIONE QUANDO

Para grandes quantidades de dados, é mais eficiente usar as duas últimas opções.

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='4-5 years'; else detail='above 5 years'; run; 

Adicione uma condição que selecione apenas as observações nas quais o valor da variável Detail não é igual a 'acima de 5 anos'. Ao usar where como um filtro, ocorrerá um erro de sintaxe:


A cláusula where não é usada para colunas computadas. Para selecionar as variáveis ​​que precisamos, precisamos de uma instrução IF seletiva. Cancela a saída da observação para o conjunto de dados criado:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Observe também que a instrução IF seletiva requer um operador aritmético. Não podemos escrever, por exemplo, assim:

 if detail contains 'above 5 years'; 

Um erro será exibido no log:


Configure o conjunto de dados SAS.


As variáveis ​​Manager_FirstName e Manager_LastName não devem estar presentes no novo conjunto de dados do SAS. Este requisito é implementado usando o parâmetro DROP, e o operador DROP também pode ser usado.

 data company1 (drop=Manager_FirstName Manager_LastName); set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Dividimos o conjunto de dados SAS criado em dois, de acordo com a condição fornecida


Em uma etapa DATA, você pode criar vários conjuntos de dados SAS. Crie um conjunto de dados separado para cada país.

Para verificar quais valores estão na coluna País, por exemplo, você pode usar o procedimento PROC FREQ .

 proc freq data=company1; table Country /nocum nopercent; run; 

Esta etapa considera quantas vezes um valor específico da variável Country ocorre no conjunto de dados SAS especificado no parâmetro data =.

O resultado desta etapa será o seguinte:


Portanto, criaremos dois conjuntos de dados em uma etapa DATA usando o operador OUTPUT e o processamento condicional:

 data US AU; set work.company1; if Country='AU' then output AU; if Country='US' then output US; run; 

Execute o código e consulte LOG:


Isto é brevemente sobre como ler e configurar conjuntos de dados SAS. No próximo artigo, apresentaremos a combinação de conjuntos de dados usando as instruções MERGE e SET.

E como PS, lembrarei a estrutura de nossas lições do SAS BASE:

Artigos que já foram publicados:

  1. Fundamentos de programação no SAS BASE. Lição 1.
  2. Fundamentos de programação no SAS BASE. Lição 2. Acesso a Dados
  3. Fundamentos de programação no SAS BASE. Lição 3. Lendo arquivos de texto.
  4. Você acabou de aprender a quarta lição.

Nos artigos a seguir, gostaria de destacar questões como juntar tabelas na Base SAS (mesclagem, conjunto), processamento condicional, loops, funções SAS, criar formatos personalizados, Macro SAS, PROC SQL.

Ficarei feliz em comentar nos comentários! Que outros tópicos você gostaria de ver nos artigos?

Source: https://habr.com/ru/post/pt426765/


All Articles