文档章节

SAS笔记-宏2

t
 tonorth123
发布于 06/24 13:31
字数 935
阅读 17
收藏 0
点赞 0
评论 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
SAS创建宏变量的七种方法

学会创建宏变量,特别是全局宏变量是应用宏的一个基础,下面我们介绍一下,创建宏变量的七种方法,并通过例子来演示。 1.通过宏函数创建宏变量。 %let dsid=%sysfunc(open(sashelp.class));...

开拓者-2017
2016/03/01
161
0
SAS学习笔记9

1.SET SET语句从一个或多个SAS数据集中读取观测值并实现纵向合并。每一个SET语句被执行时,SAS就会读一个观测到PDV中。一个DATA步可以有多个SET语句,每个SET语句又可以跟多个SAS数据集。多个...

开拓者-2017
2015/12/31
155
0
SAS学习笔记3

今天看的是SAS的数组。 在SAS中,数组存储的是变量,不是数据,数组只是在数据步(DATA STEP)有效,此处要稍微注意一下,数组的标号即下标是从“1”开始的。还有就是用{},而不是[]. 语法格...

开拓者-2017
2015/12/25
27
0
搞全闪存阵列的各执一词 宏杉说别吵了,就用我哒

全闪存阵列也许十分诱人,但并不是每一个全部使用闪存介质的存储阵列,都称得上"纯粹的全闪存阵列",它们中的许多,并不完美。 "尺有所长,寸有所短",在企业级存储市场,产品指标上略有不同...

玄学酱
05/18
0
0
SAS学习笔记5

今天详细说说指针。 相对于其他的编程语言而言,SAS在读取数据时也是通过SAS的指针控制符来控制读取数据的。指针控制符分为行指针和列指针,下面我们结合例子来说这两种指针。 1)列指针控制...

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部