SAS BASE数分--常用DATA步数据处理

2022-03-30 00:00:00 代码 观测 数组 输入 输出

先来总结一下DATA步的运行顺序,其余语句按照运行逻辑运行

DATA 语句

数据读入语句

INPUT (自定义输入数据,定义其字段名,字段类型以及字段观测值)

SET (输入已有的数据集,指定逻辑库名称以及数据集名称:SASHELP.CLASS)

MERGE (合并两个或者多个数据集)

MODIFY (插入或者对已知数据集中的观测进行替换删除)

UPDATE (更新文件数据中的观测)

接下来介绍项目中常常会用到的一些语句。

1.INPUT语句(自定义数据集。其实项目上不经常用,但是由于有些语句在学习时需要自定义一些数据集,所以在这举3个例子)。

eg1:代码输入



SAS输出1:


eg2:代码输入



SAS输出2:



eg3:代码输入

SAS输出3:

数据集a这里输入了 a b c三个变量,$代表是字符型。

数据集b后面4个分号是因为输入的观测中有分号,所以需要使用cards4以及结尾4个分号。

数据集c变量后面加了@@的符号,是为了可以使得SAS可以在一行中连续读取a的观测值,如果不写@@那么需要写10行,每行一个观测才能把a变量的所有观测读进去。

2.SET语句

eg1:代码输入(引用已有数据集)


SAS输出1:




eg2:代码输入(point 规定临时变量set语句读入的观测序号,指定输出数据集a中的3,5,7,4观测值)


SAS输出2:



eg3:代码输入(连续两个set语句(横向合并--不常用))

先准备3个模拟数据集




以上分别是数据集a,b1,b2


SAS输出3:依次是c,d


eg4:代码输入(一个set两个数据集(纵向合并--常用在数据结构一直的数据集上)



SAS输出4:




eg5:代码输入(如果想从一个数据集中同时生成两个新数据集-种,挑选不同变量;第二种,挑选不同观测)


SAS输出5:


可以用keep保留 drop清除 rename重命名 where筛选观测 以及label添加标签对数据集进行限定。


3.MERGE语句关联数据集。(常用)

eg:代码输入:



数据集a,b1拿上面set的例子。

注意1:关联前先排序,去重。关联关系只能是一对一,一对多,多对一的关系,两张表中至少对其中一张表对关联键去重。

注意2:其中,flag=compress(a||b);会有三种结果,10,01,11。11指在a 也在 b 中;10指在a中不在b1中;01指在b1中不在a中。 if a 是指任命a表为主表,保留a表中所有信息,不保留未关联上的b1表中信息,此时flag 只会有11 和 10情况。(in=a)(in=b)是固定写法,是指将在a表中的关联键任命为a的意思。

SAS输出5:


只把附表中与主表中有的相同的X合并进了主表。

4.RETAIN语句(常用)

eg1:代码输入(保留前一条状态):


SAS输出1:



eg2:代码输入(用于赋值):


SAS输出2:


eg3:代码输入(实现累乘累加):



SAS输出3:



当下一条没有赋值时,前面的值将被保留。赋初始值.()只对括号里面那一个赋值。


延伸小节

在项目上常常会遇到的情况是我们需要对缺失的值进行补充,比如某个客户的信息是每月更新一条,但是并不是每月都有这样的一条记录,这时候就需要生成一条与上月状态相同的但是月份增加的观测。以下就总结一下类似这样的情况以及其处理方法。

A-----1,如果有完整的每个月的记录,只是某个状态缺失:用RETAIN 某个状态按照上一条记录读取;

输入:


输出:

B-----2,如果没有缺失只有断点,需要在断点之间延续上一个字段的内容,补充缺失月以及缺失状态;

输入:



输出:

用新生成的qq和mm代替b和c。代码的逻辑就是先分组,对于每组计算了一下如果下一条与上一条相差值,如果为1是我们需要的,如果不为1那么相差的值减一就是我们需要补充的观测值数量,然后再一条一条补充,补充的观测状态延续上一条状态。

lag函数是指生成指定列每条观测的上一条观测,条为缺失。if first或者if last是在排序分组后,对每一组的条观测和后一条观测进行指定赋值。

5.基本新增变量的函数语句和语法LENGTH SUM MAX

eg:代码输入:



新增变量时记得赋予其长度,如果不赋予长度那么默认个变量长度,这里长度不能小于20,因为在SAS中字符占3个长度,数字1个长度。

SAS输出:

6.INPUT PUT MDY 等字符型变量与数值型变量间的转换。

eg:代码输入:


SAS输出:


具体的关于数值型日期,字符型日期怎样转化成日期型格式,在专栏章有陈列,这里不一一再赘述。

6.DO循环语句(常用)


eg1:代码输入(简单do语句):


SAS输出1:



eg2:代码输入(do while语句,有条件的循环语句当年龄大于14岁,重复执行do语句):




SAS输出2:




eg3:代码输入(do until语句,直到不满足条件停止循环):


SAS输出3:



eg4:代码输入(do over 语句--对数组进行循环处理,数组会下一步列出来):



SAS输出4:



经常使用循环语句的地方在于我们需要每个客户每个月的一条数据记录,如果缺失我们需要循环把每组的缺失补充出来;还有就是推导客户逾期情况,应还款日和实际还款日之间的月份差值以及逾期期数也是需要用到循环语句的。可以说是掌握并且灵活应用是非常重要的。

7.ARRAY数组(常用--能够批量对字段进行一定逻辑的处理)

数组分为显示下标数组和隐含下标数组两种。

A--显示下标数组包含数组名称,数组值,以及数组下标。

eg1代码输入:

定义数组:


数组初始值展示:

引用数组:


SAS输出1:new 一个叫test的数组,有10个数组元素,分别是....


put 日志中输出第四个和第六个数组元素:


eg2:代码输入(循环DO组中引用 (dim函数可以获得数组中的元素个数):




SAS输出2:newdo。一个叫day的数组,(3:10)是指数组元素是由qa1-qa10的第三个到第十个组成。array day(*) _numeric_是指将所有数值型的字段组成一个数组叫做day ,有多少个数值,*就为几。


newdo2


eg3:代码输入(使用do while 和 do until引用数组)




SAS输出3:

B--隐含下标数组由变量名,下标变量,列表名组成,引用时才需要指定下标。


eg1:代码输入(引用数组)


SAS输出1:


eg2:代码输入(用循环DO引用,使得每个变量值都*100)


SAS输出2:

eg3:代码输入(do over 数组中所有缺失值都为0,如果数组观测值多的话,这样操作就非常简便了)


SAS输出3:


eg4:代码输入(一个数组引用另一个数组)



SAS输出4:

eg5:代码输入(do while)



SAS输出5(日志中):


数组在行为衍生变量以及征信衍生变量用得非常频繁,因为可以用于批量计算近12个月,6个月,3个月的各种状态的数据。是非常重要的一块。


下次更新SQL语句啦~~~

相关文章