问题描述
我仍然对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);