數(shù)據(jù)集快速排序 trick
問題
有如下數(shù)據(jù)集,需要固定其中 stat 列的順序,

厘清思路
這里我們用到了 dow 循環(huán)來操作,對于這種由 proc means 確定的 stat 順序的 situation,dow 循環(huán)是再合適不過的了。
上 code,
data mean3;
? ?do _n_= 1 by 1 until(last.sex);
? ? ? ?set mean2;
? ? ? ?by cat sex var;
? ? ? ?ord= _n_;
? ? ? ?output;
? ?end;
run;
就是如此簡單。實際上,我們在
文章里提到過 dow 循環(huán)。注意看過程,其中,當讀完第一個 by 變量組的全部觀測時,last.sex 判定 do until 循環(huán)終止,data step 的第一次迭代結束,進入 data step 的第二次迭代,do until 的 _n_ 又從 1 開始,直到 last.sex,依次類推。我們可以發(fā)現(xiàn),一次 data step 的循環(huán)迭代,讀取的就是 一個 by 變量組的全部觀測。
提問,這里的 do _n_ by until,你覺得起到什么作用?實際上,它壓縮了經(jīng)由 set 讀取數(shù)據(jù)時 data step 的循環(huán)迭代次數(shù)。為什么這么說?正常來講,
data mean3;
? ? ? ?set mean2;
? ? ? ?by cat sex var;
run;
這里,data step 需要迭代 18 次的,而由于 dow 循環(huán)控制了一次 data step 終止的條件,即,必須遇上 last.sex,該次 data step 的迭代才能終止,因而,data step 最終只需要迭代 3 次,即可讀入全部觀測,同時借助 _n_ 作為計數(shù)器,完成了行觀測順序的 assignment。
這種方式,實現(xiàn)了對數(shù)據(jù)讀取的更大程度的控制,非常推薦日常多多使用。
細節(jié)
肯定有人要問,如果開始的數(shù)據(jù)集 stat 列不是剛好我們要的順序怎么辦?
有人就想著利用 if then,進行順序的一個個賦值,當然是可行的,但是一旦 if condition 過多,寫起來也很麻煩,這里推薦的另外一個方式是
