文档章节

SAS笔记-宏2

t
 tonorth123
发布于 06/24 13:31
字数 935
阅读 23
收藏 0

宏是一种文本,一般来说其编译是在程序执行之前。

宏变量的创建

  1. %let语句

%let macro_variables = text;

%let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集customer中的性别。但是%let语句是在执行前编译的,则宏变量等于文本sex,而不是data步中数据集customer的变量sex。

data customer;
  format date date9.;
  input @1 date date9. name $ sex $ num;
  cards;
  01May2018 mary F 90
  01May2018 harry M 85
  01Jun2018 bob M 70
  03Jul2018 lily F 30
  03Jul2018 lucy F 80
  ;
  run;

options symbolgen;
Data customer1;
  Set customer;
  %let test = sex;
Run;

 

  1. Symputx

想要在数据步中从数据集中动态的获取数据对宏变量赋值,可用symputx路径。

Call symputx(“macro_variable_name”,text);

上例中使用symputx,则每次都将变量sex的值赋予宏变量test,最后一个顾客性别为F,所以最后宏变量test等于F。

options symbolgen;
Data customer1;
  Set customer;
  Call symputx(“test”,sex);
Run;

 

  1. 在PROC SQL过程中创建宏变量

还可以在PROC SQL过程中创建宏变量。

PROC SQL;

SELECT COL1,COL2,... INTO :mvar1, :mvar2,...

FROM table-expression WHERE ... ORDER...;

QUIT;

注意,%let语句可以去掉变量名称文本前后的空格,into子句不会去掉空格。

proc sql noprint;
  select distinct date, count(distinct date) into :var_dates seperated by ' ',:num
  from customer;
quit;

 

注意:理解宏变量就是一个文本

%let X=%substr(ABCD,2,1);

则X=?,答案为A,因为“ABCD”为一个字符串,第一位为“,所以第二位为A

%let X=%substr(ABCD,2,1);

则X=?,答案为B

 

二、宏程序

  1. 宏程序的生成

%MACRO macro-program-name;

  程序

%MEND;

 

  1. 宏程序控制语句

宏程序的控制语句形式为%if-%then,%do-%end等。与一般的if-then等控制语句不同,宏变量的控制语句判断对象是宏变量。所以,并不是宏程序中就一定要使用%do-%end等宏程序控制语句的。例如,对上述customer数据集,我们想要将同一个日期的数据放到一个数据集中,则有如下两个程序:

程序一

proc sql noprint;
  select distinct date, count(distinct date) into :var_dates seperated by ' ',:num
  from customer;
quit;
%macro test1;
data s1 s2 s3;
set customer;
%do i = 1 %to &num.;
   %let var_date_&i. =  %scan(&var_dates,&i,' ');
   %if date = "&&var_date_&i.."d %then output s&i.;
%end;
run;
%mend;
%test1; 

因为语句%do i = 1 %to &num.;中的i是宏变量,所以可以在语句%let var_date_&i. =  %scan(&var_dates,&i,' ');中通过&符号被编译.

而语句%if date = "&&var_date_&i.."d %then output s&i.;是对宏变量date进行判断的,没有名为date的宏变量,所以%if判断语句没有执行,每个数据集里都有5个观测值。

 

程序二

proc sql noprint;
  select distinct date, count(distinct date) into :var_dates seperated by ' ',:num
  from customer;
quit;
%macro test1;
data s1 s2 s3;
set customer;
%do i = 1 %to &num.;
   %let var_date_&i. =  %scan(&var_dates,&i,' ');
   if date = "&&var_date_&i.."d then output s&i.;
%end;
run;
%mend;
%test1; 

与程序一不同,语句if date = "&&var_date_&i.."d then output s&i.;对数据集中的date变量进行判断,所以会把同一个日期的数据输出到同一个数据集中。结果如下所示,

 

注意:理解宏程序为文本

%macro counts(rows);
proc freq data = customer;
  Tables %if &rows ne  %then &rows * ;
  Sex;
Run;
%mend counts;
%counts; 

其中,当语句%if &rows ne  %then &rows * ;的if为真时,则有&rows * sex; 即,

proc freq data = customer;

  Tables &rows * Sex;

Run;

当if为假时,则只有Sex; 即

proc freq data = customer;

  Tables Sex;

Run;

所以宏程序为文本,且是先编译后执行的。

 

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 8
码字总数 7953
作品 0
私信 提问
SAS学习笔记7

一、简介 SAS通过宏过程可以把 数据步或者过程步的功能进行封装,在宏过程中可以定义参数,通过调用宏过程把实参传递给形参进行引用。宏过程就相当于关系数据库中的存储过程,调用时只需要知...

开拓者-2017
2015/12/28
188
0
SAS学习笔记

SAS编程语言 学习一门语言重要的是打好语法基础,所以,从最基础的开始。 逻辑库是SAS编程语言的一个重要知识点,是数据步和过程步读取数据集或关系数据库中的表或者存储路径下对应文件的桥梁...

开拓者-2017
2015/12/24
69
2
SAS导入txt数据

众所周知,在我们进行数据处理分析的时候,不会是一直自己手动输入,这就要求从外部读取数据了。 下边我们讲解从txt文件中将数据读取出来。 我们读取的txt文件如下college_inf.txt: depart...

开拓者-2017
2016/01/19
1K
0
SAS学习笔记6

SAS过程步(proc step)是SAS系统的另一个核心步,对数据步(DATA STEP)生成的数据集进行分析和处理,挖掘数据信息。 SAS过程步用来对生成的数据集进行处理和分析,是SAS内部已经编译好的过...

开拓者-2017
2015/12/28
78
0
SAS学习笔记4

数据步是SAS系统用来对外部数据文件或其他数据库中的表数据或已经生成的数据集进行处理的过程,其目的是生成SAS能识别的数据。数据步处理完成后,生成的数据存储到逻辑库对应目录中,SAS其他...

开拓者-2017
2015/12/25
36
0

没有更多内容

加载失败,请刷新页面

加载更多

JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
24分钟前
14
0
0022-如何永久删除Kafka的Topic

1.问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Topic时报错“already exists”。 2.问题复现...

Hadoop实操
26分钟前
1
0
技术工坊|区块链中的p2p网络(上海)

区块链是一个去中心化的系统,每个节点分布在全球各地,那么节点之间是如何自发地组成网络,又如何进行通信的?区块链中的p2p网络算法与bt下载中的p2p网络有什么区别?11月28日,第29期技术工...

HiBlock
32分钟前
2
0
MySQL性能优化之char、varchar、text的区别

在存储字符串时, 可以使用char、varchar或者text类型, 那么具体使用场景呢? 参考下面这个表结构: 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。 ...

hansonwong
34分钟前
2
0
并发编程系列:4大并发工具类的功能、原理、以及应用场景

一:并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。 2.并发容器 提供各种线程安全...

游人未归
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部