首页 > 解决方案 > 如何编写一个宏来遍历变量列表并返回那些缺失的变量

问题描述

我对 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);

推荐阅读