SAS初学者笔记---005---数据的分割及筛选
关于数据的分割及筛选,个人认为这是数据清洗诸多步骤中首要的一步,关于数据清洗的概念请看官移步至其他博客。
而在本章介绍的数据的分割及筛选主要包括以下语句:
- if,where,IF语句除用作判断结构外,还可以同WHERE对已知数据集的筛选
- output,delete (if)选择观测(横行)是否被输出到数据集中,通常与判断结构联用
- drop,keep,选择变量(纵行)是否被输出到数据集中
DROP/KEEP 对变量的选择
DROP声明不输出到数据集中的变量
KEEP声明输出到数据集中的变量
KEEP的使用逻辑是指示需要保留的变量名,DROP需要指示不需要保留的变量名。以上两语句若不指示变量,则视为全保留
OUTPUT/DELETE 对观测的选择
一般情况sas程序在读取数据时往往会经历一个循环后才会将一个观测输出到数据集中,但是在某些特殊的数据构造需要下,需要在一次循环中多次输出观测(如卡方分析的数据构造),此时便需要使用OUTPUT语句,同时也有删除不满足需求的观测的需要,此时便需要使用DELETE语句,举例如下:
如果在DATA 步中使用了OUTPUT语句,每次迭代结束时就不会自动将观测写入任何 数据集。因此,一旦在程序使用了OUTPUT语句,则必须为所有需要写 入数据集的观测使用OUTPUT语句
IF/WHERE 选择观测
使用IF语句选择观测
使用WHERE语句选择观测
sas-HELP
WHERE与IF的功能相似,但WHERE与IF语句之间存在本质的区别,关于此部分内容撰写时我搜集了许多的资料,其中无一例外都有提到
- WHERE与IF的筛选及读数据入PDV这两步的顺序差异(Where从buffer中进行筛选再读入pdv,If先读入pdv再进行筛选)这样的模式是导致的结果就是使用where筛选出的数据是在输出至PDV就已形成好的,而使用IF筛选出的数据是在PDV形成后再筛入数据集中。关于PDV的解释详看以下文档:经管之家,CSDN
- 此外WHERE能作用于整段代码,而IF仅对其下方的代码生效
我又在B站上看到了这一视频——关于where与if。
举例如下
data test;
set sashelp.class end=eof nobs=obs;
IF sex = 'F';
var=eof;
put name= sex= obs=;
/* IF sex = 'F';*/
/* where sex = 'F';*/
run;
proc print data=test;
run;
代码如上,建议复制到本地自行试验。
需要特别解释以下代码中的几个关键词:
- end=eof ,若当前观测为数据集中最后一个,则eof=1,反之则为0
- nobs=obs,提示当前数据集中总观测数
- put name= sex= obs=,将相应内容通过日志窗口打出
上述代码中有三部分相关IF与WHERE语句,分别执行它们会发生什么
此段代码中执行了第一段IF语句,
- IF后的PUT语句作用即为上图左侧内容,与result窗口内数据一致
- 同时var变量全为0,指示IF语句执行时先读入pdv,再筛选数据
此段代码执行了尾端的IF语句 - PUT语句执行内容(log窗口)与result窗口内容不一致,与前述代码对比可见IF语句仅能作用其下方的代码
- var变量全为0,指示IF语句执行时先读入pdv,再筛选数据
上述代码执行了在尾端的WHERE语句
- LOG窗口与result窗口内数据一致,可见where语句能作用于全局
- var变量最后一行数据为1,指示此行数据为数据集最后一行(是已经过筛选的数据),可见WHERE语句先筛选出数据再导入PDV中
小结
关于本节内容尤其是IF与WHERE语句部分,作者查阅了相当多的资料,但尚未做到完全理解,希望读者在理解这一部分内容时能多看看本节内容中的链接,可能会帮助你理解,谢谢,下期再见。
另外,对数据的选择也不仅仅局限与本节内容所述,常见相关内容包括:
- 在使用INFILE语句读取数据时的跳行处理(firstobs,obs)
- 对已生成的变量进行计算、提取字符等 (substr,scan)
- 判断结构的使用(IF–THEN)
参考:SAS 对部分观测得处理