subscript:下標的三種形式
{5,1}5行1列
{1:5,1:2}5行2列
{*}通過計算array的variable的數量來獲得參數,*不能與_temporary_連用,在定義多維數組的時候也不可用
array-elements:組成數組的元素的變量名
默認情況下是數組名+序號,但是也可以自己設定(注意是變量的名字,設定好后可以參與運算的那種),還可以有一下四種形式
_ALL_ specifies all variables,If you use _ALL_, all the previously defined variables must be of the same type
_NUMERIC_ specifies all numeric variables.
_CHARACTER_ specifies all character variables.
_TEMPORARY_creates a list of temporary data elements.
initial-value-list:初始化列表
可以用逗號或者空格分隔,他們的類型要一致
可以用這種形式簡化要輸入的數據<constant-iter-value*> <(>constant value | constant-sublist<)> ,記住前面是重復數,后面才是要重復的數據
ARRAY x{10} x1-x10 (10*5);
ARRAY x{10} x1-x10 (5*(5 5));
ARRAY x{10} x1-x10 (5 5 3*(5 5) 5 5);
ARRAY x{10} x1-x10 (2*(5 5) 5 5 2*(5 5));
ARRAY x{10} x1-x10 (2*(5 2*(5 5)));
一些比較特殊的數組的定義
data; a = 2; b = 3; c ='c'; array me{*} _numeric_; /*結果只能輸出前兩個,這個數組起到的作用是接受定義在他前面的所有數值變量的值,不會接受其他值*/ put me(1)= me(2)= me(3)=; run;
data; array new{2:5} green jacobs denato fetzer(5 6 7 8);/*這里的第一個下標是從2開始到5,所以new(2)會輸出5,而不是6*/ put new(2)=; run;
臨時數組應注意的幾點:
1:臨時數組的變量沒有名字,使用時要用數組名加下標,比如test(1)。
2:不能出現在輸出的數據集上,不是臨時數組創建的變量會出現在數據集上。
3:不能用特殊下標(*)來引用所有元素
4:數組元素被自動保存,每輪data步不會被置為缺失
臨時數組的優點
5:使用臨時數組可以少占用內存,加快執行時間。
獲取數組維度的函數,比如 array mult{3,4,5} ,分別獲取三個維度的大小的函數dim(mult,1) dim(mult,2) dim(mult,3)
對於只有一維的數組,直接用dim(array name)即可
對數組值的重復初始化
ARRAY x{10} x1-x10 (10*5);
ARRAY x{10} x1-x10 (5*(5 5));
ARRAY x{10} x1-x10 (5 5 3*(5 5) 5 5);
ARRAY x{10} x1-x10 (2*(5 5) 5 5 2*(5 5));
ARRAY x{10} x1-x10 (2*(5 2*(5 5)));
data temp; input x@@; cards; 10 20 30 ; run; data test (drop=i); (使用drop選項比drop語句划算) set temp; array a(5) a1-a5; *是聲明語句,不會執行; do i=1 to 5; a(i)=i; end; run; proc print noobs data=test; *打印出來,不帶觀測值序號,數據集為test; run;
data missing; input x y$ z$ m; cards; . . . 1 2 . 3 . ; run; data result; set missing; array char _character_; *set一次進入pdv四個變量,兩個字符型,兩個數值型,這里的意思是獲取所有字符型變量形成一個字符型數組; array numr _numeric_; *這里是獲取所有數值型變量形成數值型數組; do over char; if char eq "" then char="null"; put "char"; *這里會輸出兩次,因為四個變量中有兩個位字符型,如果你修改讀取數據集中字符型和數值型的個數,這里輸出的次數也自然會不同; end; do over numr; if numr eq . then numr=0; put "numr"; *這里會輸出兩次,因為四個變量中有兩個為數值型; end; run;
*輸出三科成績全部及格的人的id以及成績;
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 res(drop=k); set score; k=0; *對於這種要判斷多個變量的值是否滿足某個條件的程序最好都設置一個計數變量,並且在每輪循環之前都有一個清空操作; array numr _numeric_; do over numr; if numr >= 60 then k=k+1; *這里判斷的全都是及格的,如果要判斷的數不相同,比如有一門大於60有一門大於65,則應該設置一個數組來取下標進行判斷; end; if k>2 then output; *這里只有單個數據集所以output后面沒加數據集的名字,對多個數據集必須加上; run; proc print noobs data=res;