如何编写将遍历变量列表并返回缺失变量的宏

问题描述

我仍然对SAS编码还很陌生,并且我不太擅长循环。我想编写一个宏,该宏将遍历变量向量,并返回缺少该变量的'study_id'表。理想情况下,宏会将每个列表附加到一个最终表中。

我知道我需要一个从1迭代到变量向量长度的循环。我还对单个变量测试了sql步骤,它可以工作。这是我所拥有的,以及用于重现问题的截断数据集:

data test;
input Study_ID married_partner $ PT_Working $;
cards;
1 Yes Yes
2 No  No 
3 Yes .
5 Yes No 
6 Yes No 
8 Yes Yes
9 . No 
10 Yes No 
11 Yes No 
12 Yes No 
13 . No 
14 Yes No 
15 No No 
17 Yes . 
19 Yes No 
20 Yes No 
21 Yes No 
;
run;

%let var=married_partner PT_Working;
%macro missing(data=,list=,var=);
 do i = 1 to dim(&var);
    proc sql;
    create table missing_&var as
    select &list
    from &data
    where missing(&var);
    quit;
 end;
%mend;

%missing(data=PT_BASELINE_ALLPT,list=Study_ID,var=&var) 

我遇到以下错误

61          missing_married_partner PT_Working
                                    __________
                                    78
                                    202
NOTE: Line generated by the macro variable "VAR".
61         married_partner PT_Working
                           __________
                           22
ERROR 78-322: Expecting a '.'.

ERROR 202-322: The option or parameter is not recognized and will be ignored.

ERROR 22-322: Syntax error,expecting one of the following: !,!!,&,*,**,+,',-,'.',/,<,<=,<>,=,>,>=,?,AND,CONTAINS,EQ,EQT,GE,GET,GT,GTT,LE,LET,LIKE,LT,LTT,NE,NET,OR,^=,|,||,~=.  

我要去哪里错了,应该添加什么进一步的代码以将所有这些组合到一个表中?

感谢您的帮助

解决方法

您实际上不需要此问题的宏代码。请记住,宏代码的目的是生成SAS代码,因此在尝试使用宏逻辑生成SAS代码之前,首先要弄清楚要运行的SAS代码。

要处理一系列变量,通常可以使用数组。尽管它们确实必须是相同的类型(数字或字符)。

如果您只想查找任何变量的值缺失的观测值,则甚至不需要数组。 CMISS()函数将适用于数字和字符变量。因此,此步骤将找到列出的两个变量的所有缺失值的所有观测值。

 data want ;
   set have;
   if cmiss(of married_partner PT_Working);
 run;
   

如果您希望它更灵活,可以在变量列表中使用宏变量。

 data want ;
   set have;
   if cmiss(of &varlist);
 run;

如果在PROC SQL中这样做比较困难,因为它不支持使用变量列表(包括OF关键字)。相反,您需要在变量名称之间添加逗号。

 create table want as select * from have where cmiss(married_partner,PT_Working);