SAS中兩個(gè)語(yǔ)句可以完成相同操作,應(yīng)該如何選擇?
現(xiàn)在有一個(gè)記錄聯(lián)系方式的數(shù)據(jù)集contact,其中有一條觀測(cè)的地址信息(Address)缺失。
現(xiàn)在想把地址缺失的觀測(cè)刪除,可以有兩種做法:
(1)使用IF語(yǔ)句和DELETE語(yǔ)句來刪除滿足條件的觀測(cè),其基本形式如下:
IF 條件表達(dá)式 THEN DELETE;
在該過程中,SAS首先判斷條件表達(dá)式是否為真。如果為真,則執(zhí)行THEN從句中的DELTET語(yǔ)句。DELETE語(yǔ)句會(huì)讓SAS立即返回DATA步的開始處讀取下一條觀測(cè),當(dāng)前觀測(cè)不會(huì)寫入輸出數(shù)據(jù)集中。注意,DELETE語(yǔ)句不會(huì)刪除輸入數(shù)據(jù)集中的觀測(cè)。
data work.contact_address;
set saslib.contact;
if address = "" then delete;
run;
(2)另一種方式是直接選取滿足條件的觀測(cè),即使用取子集的IF語(yǔ)句(Subsetting IF),其基本形式如下:
IF 條件表達(dá)式;
當(dāng)條件表達(dá)式的值為真時(shí),繼續(xù)處理該觀測(cè);否則停止處理該觀測(cè)并返回DATA步開始處讀取下一條觀測(cè),且該觀測(cè)不會(huì)寫入輸出數(shù)據(jù)集。該IF語(yǔ)句稱為選取子集的IF語(yǔ)句,是因?yàn)樗a(chǎn)生的輸出數(shù)據(jù)集是原始數(shù)據(jù)集的子集。
data work.cwork.contact_address;
set saslib.contact;
if address ^= "";
run;
當(dāng)DELETE語(yǔ)句和取子集的IF語(yǔ)句都可以完成相同的操作時(shí),選擇哪種方式呢?主要依據(jù)如下:
由于DELETE語(yǔ)句和取子集的IF語(yǔ)句需要構(gòu)造的條件表達(dá)式不同,因此在編寫程序的時(shí)候,通常選擇需要較少比較次數(shù)的條件表達(dá)式的語(yǔ)句,因?yàn)檫@會(huì)提高程序執(zhí)行效率。
在比較次數(shù)相近時(shí),通常選擇正向的條件表達(dá)式,也就是說選擇取子集的IF語(yǔ)句。
當(dāng)數(shù)據(jù)中存在缺失值或可能有拼寫錯(cuò)誤的數(shù)據(jù)值時(shí),使用取子集的IF語(yǔ)句也更容易產(chǎn)生需要的結(jié)果。
請(qǐng)前往:http://lygongshang.com/TeacherV2.html?id=166