data missing; input x y$ z$ m; cards; . . . 1 2 . 3 . ; run; data result; set missing; array char _character_; array numr _numeric_; do over char; if char eq "" then char="null"; end; do over numr; if numr eq . then numr=0; end; run;
結果顯示: java
需求:
若是給定一個數據集,發現其中有不少變量確實,可是事先又不知道究竟是哪些變量缺失,並且該數據集數據結構很是不穩定,此次的變量數和下次的變量數可能不同,因此,儘管SAS有一個過程步PROC STDIZE能夠完成相似的需求,可是對於這種需求是沒法完成的,除非每次調用程序的時候更改PROC STDIZE的VAR變量列表,這在實際項目中時不可能的,主要緣由是維護代碼成本過高。
程序解讀:
1)程序聲明瞭兩個數組語句,一個是全部字符變量,一個是全部數值變量。
2)DO OVER CHAR 語句是循環語句,意思是循環全部的數組CHAR對應的變量(這裏固然是全部的字符變量),每循環一次,程序將執行一次IF CHAR語句,若是CHAR EQ ""條件爲真,則執行CHAR="null",不然不執行。
3)循環完畢全部的字符變量後,程序繼續執行下面的DO OVER NUMR語句,原理和上面相似。
4)執行完兩個循環語句後,系統執行RUN語句,輸出第一條觀測。程序跳回至DATA步開頭,再次執行第二條觀測,依此類推。
算法
data score; input id$ x y z; cards; a 75 84 65 b 54 74 71 c 51 56 52 d 50 50 60 ; run; data qualify; set score; k=0; array chengji(3) x y z; array base(3)_temporary_ (60,60,60); do i=1 to 3; if chengji(i) ge base(i) then k+1;; end; if k=3 then output qualify; run;
結果以下: 編程
score數據集: 數組
Qualify數據集: 數據結構
3)對第二條到最後一條觀測,系統通過相似的執行,最後知足要求的顯然只有第一條觀測。 編程語言
data single; input id$ q1$ q2$ q3$ @@; cards; 01 a b c 02 a b a 03 b a c 04 a b c ; run; data correct(drop=i); k=0; set single; array q(3); array crt(3) $_temporary_('a','b','c'); do i=1 to 3; if q(i)=crt(i) then k+1; end; run;
correct數據集: spa
需求以下:
對數據集single,一共有三道選擇題,四個學生都給出了本身的答案,而每一題的正確答案只有一個,分別是a;b;c。試統計所有正確回答三個問題的學生。
程序解讀:
參考上面的2.統計成績及格人數
指針
data a; input x1-x7; cards; 23 44 81 13 42 34 26 14 18 10 20 33 11 50 ; run; data final; set a; array arr(1:7) x:; array copy(1:7) cx1-cx7; do m=1 to dim(arr); copy(m)=arr(m); end; do i=1 to dim(copy); do j=i+1 to dim(copy); if copy(j) > copy(i) then do; temp=copy(j);copy(j)=copy(i);copy(i)=temp; end; end; end; run;
final數據集: code
2)從第八行到倒數第二行程序執行冒泡算法,經過兩個DO循環語句,在嵌套DO語句裏面,經過比較相鄰兩個新變量的值,若是後一個變量值大於前面的變量值,借用一箇中間臨時變量TEMP對調二者,如此循環直到最後一個變量。 排序
程序以下:
options symbolgen; data missing; input n1 n2 n3 n4 n5 n6 n7 n8 c1$ c2$ c3$ c4$; datalines; 1 . 1 . 1 . 1 4 a . c . 1 1 . . 2 . . 5 e . g h 1 . 1 . 3 . . 6 . . k l 1 . . . . . . . a b c d ; data _null_; if 0 then set missing nobs=obs; array num_vars[*] _NUMERIC_; array char_vars[*] _CHARACTER_; call symputx('num_qty', dim(num_vars)); call symputx('char_qty', dim(char_vars)); call symputx('m_obs',obs); stop; run; %put &num_qty &char_qty &m_obs; data _null_; set missing end=finished; array num_vars[*] _NUMERIC_; array char_vars[*] _CHARACTER_; array num_miss [&num_qty] (&num_qty * 0); array char_miss [&char_qty] (&char_qty * 0); length list $ 50; do i=1 to dim(num_vars); if num_vars(i) eq . then num_miss(i)+1; end; do i=1 to dim(char_vars); if char_vars(i) eq '' then char_miss(i)+1; end; if finished then do; do i=1 to dim(num_vars); if num_miss(i)/&m_obs. ge 0.7 then list=trim(list)||' '||trim(vname(num_vars(i))); end; do i=1 to dim(char_vars); if char_miss(i)/&m_obs. ge 0.7 then list=trim(list)||' '||trim(vname(char_vars(i))); end; call symputx('mlist',list); end; run; %put &mlist; data notmiss; set missing(drop=&mlist); run;
Notmiss數據集以下: