我对SAS非常陌生,并试图学习最佳做法。我试图编写一个简单的宏来挑选特定数据集中缺少值的任何给定字段。我们的想法是遍历每条记录(行),并让do(for)循环充当if语句中的OR。我的问题是SAS宏不通过整个数据集
- 我的理解是宏观 - 曾称,应该在我的数据集的每一行来执行,但在这种情况下,它似乎只进行一次执行它(也就是只做循环似乎执行一次而不是100次)。
有没有更好的方法来做到这一点?
/* say I have a dataset with fieldA fieldB fieldC fieldD etc. and 100 records, some of which were missing */ %let varList = fieldA fieldB; /* check fieldA and fieldB */ %ReportIncompleteFields(sasdata.myDAta, &varList., work.tempData); %macro ReportIncompleteFields(inDataName, chkVars, outDataName); %let numVars = %sysfunc(countw(&chkVars.)); length keepRrd 8; keepRcd = 0; data &outDataName.; set &inDataName.; %do ii = 1 %to &numVars.; %let iiVarName = %scan(&chkVars., &ii.); %if &iiVarName. = '' %then keepRcd=keepRcd+1; %end; %if keepRcd=0 %then delete; run; %mend ReportIncompleteFields;
你能用数字开始一个宏变量吗? – Reeza
Reeza - 号你为什么问? – Tom
我以为iiVarName是在数据块内部,SAS会将它解释为数据集中的一个变量。也就是说,我没有检查“iiVarName”==“,而是数据集中”iiVarName“名称下的记录为空或不是。但是阶梯显然不是真的。 – adjfac