2013-05-17 56 views
0

如何將if語句應用於大量變量而不必重寫條件。例如,假設我有一組變量性別,年齡,身高...(約60個變量),並且我想指定條件SAS中變量的遞歸命令

if sex =。那麼性別= -99;如果年齡=,則爲 。那麼年齡= -99; 。 。 。 數據集中存在的所有60個變量。有沒有快速的方法來做到這一點?

謝謝

+0

使用一個數組和一個'for'循環。 – Blazemonger

+0

SAS沒有'for',它是一個'do'循環;) – Joe

+0

另外,我很失望打開這個線程並且沒有找到一個寫實際遞歸宏或FCMP例程的理由...... – Joe

回答

2

使用數組。

array arr{60} sex age height .... ; 

do i = 1 to 60; 
    if arr{i} = . then arr{i} = -99; 
end; 

這就是說,要考慮重新編碼這樣的缺失值是否真的是你想要做的。大多數SAS程序知道缺失值並能以合理的方式處理它們;把它們變成一個數字值可以讓你咬在後面。例如,如果您嘗試使用PROC SUMMARY計算總和或平均值,則結果將不再有意義;同樣如果您嘗試使用統計過程來分析數據。

+1

'array arr _numeric_;如果你想完成所有這些(看起來像海報)似乎是正確的。 – Joe

1

除了由Hongi大井答案,如果你想要爲所有在數據集中的變量做到這一點(這聽起來像你這樣做),不想給他們打出來,就可以得到SAS提供你將變量列表提供給你的數組。

例子:

%macro getvars(dsn); 
%global vlist; 
proc sql; 
    select name into :vlist separated by ' ' 
    from dictionary.columns 
    where memname=upcase("&dsn"); 
quit; 
%mend; 

下面是這個和其它實例的引用:How to read variable names in a SAS data set?

此外,你可能想,如果你想這對於字符串變量工作太考慮使用缺少的功能。

E.G.如果缺少(var),那麼做;

+0

這是一個好主意,在你的回答中包含鏈接代碼的相關部分。儘管包含了詳細的鏈接和/或超出了答案的範圍,但SO中的答案通常應該是自我完整的,而不需要引用其他網站。 (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers瞭解更多信息。) – Joe

0
data have; 
input x y z a b; 
datalines; 
1 2 3 . 5 
4 5 . 1 2 
4 3 . . 1 
;;;; 
run; 

proc stdize data=have out=want reponly missing=-99; 
run; 

如果你真的想要做的所有的人(或列出那些你想做的事)。 STDIZE是SAS/STAT的一部分,所以希望你有這個。