sas - 如何编写一个宏来遍历变量列表并返回那些缺失的变量
问题描述
我对 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 代码。
要处理一系列变量,您通常可以使用数组。尽管它们确实需要是相同的类型(数字或字符)。
如果您只想在任何变量上查找缺失值的观察值,您甚至不需要数组。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);
推荐阅读
- c# - 在 Entity Framework Core 上添加迁移时出现 NET 5 错误
- docker - 允许 docker exec 的 OPA 策略
- javascript - 带有图像和图像描述的容器是响应式的
- javascript - 使用js计算类的属性
- r - 扰乱图交叉点数的问题
- linux - 在可执行文件中嵌入版本信息并从 Linux 核心转储中检索它?
- c# - 为 JWT 的 AsymmetricSecurityKey 交换 SymmetricSecurityKey
- javascript - 压缩多个 PDF 并下载 zip 文件?
- javascript - Chrome Devtools 时间轴中资产的不同颜色深浅意味着什么?
- javascript - 尝试创建 javascript 以用破折号分隔 +1 10 位全球数字