我對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