本篇文章介紹如何利用sas進(jìn)行缺失值的查詢工作。
假定我們有數(shù)據(jù)集aa,包含如下變量(數(shù)據(jù)省略):
ID dose gender age t0 t1 a1 a2
最簡單的方式當(dāng)然就是挨個變量找缺失值,如下:
data missing;
set aa;
if id=. or dose=. or gender=. or age=. or t0=. or t1=. or a1=. or a2=.;
proc print;
run;
這種方式很好理解,就是利用if語句逐個判斷每個變量是否有缺失(注意,如果變量時文本型,不能寫=.,而是=" "),但缺點也是顯而易見的,如果不是現(xiàn)在的8個變量,而是80個變量,那寫一遍估計要累個半死。所以我們用下面的語句節(jié)省體力:
data missing(drop=i);
set aa;
array num{8} id dose gender age t0 t1 a1 a2;
do i=1 to 8;
if num{i}=. then output;
end;
這種方式好像比上面的更復(fù)雜了,但效率提高了n倍(取決于你的變量有多少)。這種方式是利用數(shù)組判斷缺失值,不管有100個還是1000個變量,對數(shù)組來說沒什么區(qū)別,只是數(shù)組中變量的個數(shù)改變一下而已(如本例中的8)。
當(dāng)這種方式仍不是最節(jié)省的,因為我們還是需要把這8個變量一一寫出來,那可不可以就不寫變量名呢。當(dāng)然可以,還有更簡單的方式如下:
data missing(drop=i);
set aa;
array num{*} _all_;
do i=1 to dim(num);
if num{i}=. then output;
end;
當(dāng)這種方式更簡單了,而且是個通用語句,不管你有10個還是1000個變量,都可以用這種方式來查詢,一個字母都不用改。當(dāng)然前提是所有變量都是數(shù)值型,如果是文本型,那就應(yīng)該是num{i}=" "。
還有另外一種非常簡潔 的方式是利用函數(shù),如下:
data missing(drop=i);
set aa;
array num{*} _all_;
do i=1 to dim(num);
if missing(num{i}) then output;
end;
用函數(shù)的這種方式有什么好處呢?起碼有一點,你不用考慮到底是數(shù)值還是文本,全部都是missing(變量)就行了。否則你還得想著數(shù)值是.,文本是" "。一不小心忘了容易出問題。
前面所說的都是假定所有變量都是同一種類型的,如果變量中既有數(shù)值型,又有文本型,那怎么辦呢?如下程序就很簡單了:
data missing(drop=i);
set aa;
array a _numeric_;
do i=1 to dim(a);
if missing(a) then output;
end;
array b_character_;
do i=1 to dim(b);
if missing(b) then output;
end;
毫不夸張地說,這個簡直就是個缺失值的通用語句,同時遍歷了數(shù)據(jù)集中的數(shù)值型和文本型的所有缺失值。所有的缺失值查找,幾乎都可以這一語句來實現(xiàn),它幾乎包含了所有的可能情況,還能苛求什么呢?套用就行了。