今天出一张Table,出BigN时只纳入所有分析变量不为空的受试者进入分析。这个操作不复杂,笨拙一点的方法是对每个分析变量依次进行not missing()
判断,可是这个分析变量足足有20个,想到要手动输出20个变量名并要使用AND连接合并成一个判断语句,我就直接排除这个方法了。
接下来的思路就是计数空值变量,只保留计数为0的记录。计数变量空值的函数是CMISS
、NMISS
,这里我思考的时候想错了。我原本以为CMISS
只能计数字符型变量,而实际上CMISS
函数可以同时计数字符型和数值型的变量,NMISS
只能计数数值型变量。借由上面那个“误区”,就要考虑一个问题——如何提取数据集中的同一类型的变量?
不管是在数据集中保留同一类型的变量,还是对同一类型变量集中操作,首先是要将同一类型变量的名称提取出来。这里需要用到SAS字典中的Columns数据集,这个数据集保存了SAS系统中各个逻辑库中的各个数据集的变量信息,调用SAS字典需要使用Proc SQL进行调用,先来看一下Columns数据集中的内容,以SASHELP逻辑库中的Class举例:
proc sql noprint;
create table test as
select *
from dictionary.columns
where libname="SASHELP" and memname="CLASS";
quit;
SAS系统中的所有数据集中的变量信息都可以通过以上方式获取,可以根据工作的需要自行对这些信息进行整合。比如,我想使用CMISS函数计数某个数据集记录中各变量的缺失情况,这时候需要把这些变量拼接在一起并使用,
间隔,并把结果保存到宏变量中,方便使用。
proc sql noprint;
select name into: varname separated by ","
from dictionary.columns
where libname="SASHELP" and memname="CLASS";
quit;
%put &varname;
data test;
set sashelp.class;
if cmiss(&varname) >0 then delete;
run;
宏变量的内容如下:
如果想要保存数据集中的特定类型的变量,我们可以在Proc SQL中筛选时添加条件type="char"
或者type="num"
,为方便使用KEEP语句,拼接变量名时,可以使用空格作为间隔,具体代码就不再演示了。
若有疑问,欢迎评论区交流!