文档章节

SAS笔记-宏2

t
 tonorth123
发布于 06/24 13:31
字数 935
阅读 20
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

Flask 开发填坑

插件的选择: flask-security 真的是个鸡肋啊。自带的页面,好丑。还不如用flask-login来做呢。

pearma
8分钟前
0
0
讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
44分钟前
0
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
51分钟前
1
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
今天
179
10
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部