SAS編程技巧(二)
經(jīng)過一段時間的積累,今天又有一些工作中遇到的問題分享給大家,有些內(nèi)容可能理解的不夠透徹,如有不對的地方還請大家指正。
1、使用數(shù)據(jù)集選項的時候是否加括號
我們新建數(shù)據(jù)集的時候往往需要把一個或多個數(shù)據(jù)集SET進(jìn)來,這個時候我們會用數(shù)據(jù)選項KEEP=、DROP=......對數(shù)據(jù)集進(jìn)行篩選。當(dāng)要刪除多個變量的時候,很多人會習(xí)慣性的給多個變量加上括號,如下面的錯誤示例:
data class1;
set sashelp.class(where=(age>15) drop=(name sex));
run;
是否加括號取決于數(shù)據(jù)集選項是否要加判斷或者對變量進(jìn)行操作,比如where=和rename=就需要加括號,drop=和keep=就不需要加括號。
正確代碼如下:
data class1;
set sashelp.class(where=(age>15) drop=name sex);
run;
2、compress函數(shù)不能用于刪除單詞
在做一個項目的時候需要刪除變量中的'one'這個單詞,首先想到的就是用compress(var,'one')來解決,在最后QC的時候發(fā)現(xiàn)多刪了個字母‘e’,原來compress是把字符串中的‘o’、‘n’、‘e’都刪除了,而不是按單詞來刪除。這個時候可以用tranwrd把整個單詞替換為空,tranwrd(var,'one','');
3、SAS將兩個連續(xù)的引號作為一個引號
例如,要表示字符串Tom's,則使用下面的形式:
if name='Tom''s' then do;
要表示Tom“s,可以使用以下形式:
if name="Tom""s" then do;
4、謹(jǐn)慎使用if else
在一次QC的過程中,發(fā)現(xiàn)我的數(shù)據(jù)集比D側(cè)的少一條,代碼邏輯是:
if index(var,'1') then output;
else if index(var,'2') then output;
其中有個原始數(shù)據(jù)是var=“1&2”,if else在滿足一個條件以后就不執(zhí)行后面的程序了,所以會少數(shù)據(jù)。