Array

Cách sử dụng Array trong Data Step

Mục lục

Trước hết, ta sẽ tạo dữ liệu dummy như sau:

DATA OLD;
	ARRAY WIDTH{6};
	ARRAY HEIGHT{6};

	DO I=1 TO 100;
		DO J=1 TO 6;
			WIDTH{J}= RAND('NORMAL', 5, 5);
			HEIGHT{J} = RAND('NORMAL', 5, 5);
		END;
		OUTPUT;
	END;

	DROP I J;
RUN;
WIDTH1 WIDTH2 WIDTH3 WIDTH4 HEIGHT3 HEIGHT4 HEIGHT5 HEIGHT6
23.907 9.744 20.407 14.863 16.753 15.579 19.537 12.071
13.334 15.167 12.749 11.794 13.657 18.993 15.1 6.593
21.634 16.704 13.736 22.898 18.835 11.681 13.257 5.817
13.032 1.859 22.652 8.278 23.622 6.896 15.276 18.14
18.088 16.164 17.558 14.974 18.869 14.706 19.07 19.154

Giả sử ta muốn tính diện tích với hai kích thước đã biết trước, ta làm như sau:

DATA NEW;
  SET OLD;
  AREA1=WIDTH1*HEIGHT1;
  AREA2=WIDTH2*HEIGHT2;
  AREA3=WIDTH3*HEIGHT3;
  AREA4=WIDTH4*HEIGHT4;
  AREA5=WIDTH5*HEIGHT5;
  AREA6=WIDTH6*HEIGHT6;
RUN;

Cách xử lý như trên dễ bị sai sót do cần phải viết nhiều dòng lệnh cho các biến có cấu trúc tương tự nhau. Để giải quyết vấn đề, ta sẽ sử dụng Array trong SAS như sau:

DATA NEW;
	SET OLD;
	ARRAY W{6} WIDTH:;
	ARRAY H{6} HEIGHT:;
	ARRAY A{6} AREA1-AREA6;
	DO I=1 TO 6;
		A{I}=W{I}*H{I};
	END;
RUN; 

Khởi tạo array

Để khởi tạo array, ta có các cách như sau:

DATA NEW;
  SET OLD;
  ARRAY A{10};
RUN;

Cú pháp như trên sẽ tạo ra các biến có tên A1, A2, …, A10. Chú ý số 10 trong A{10} nghĩa là độ dài của array. Trong sas, các array được đếm từ số 1. Ta cũng có thể làm như sau:

DATA NEW;
  SET OLD;
  ARRAY A{10} AREA1-AREA10;
RUN;

Nếu các biến AREA1, AREA2, …, AREA10 không có sẵn trong dữ liệu thì câu lệnh trên sẽ tạo ra các biến AREA1, AREA2, …, AREA10 tương ứng với phần tử của array A{1}, A{2},..., A{10}.

Các array có thể là array tạm (nghĩa là không xuất hiện ở dữ liệu đầu ra). Array tạm sẽ làm chương trình xử lý nhanh hơn.

DATA NEW;
  SET OLD;
  ARRAY A{10} _TEMPORARY_;
RUN;

Tạo array với các biến có sẵn

Tạo array với các biến có cùng cấu trúc tên

DATA NEW;
  SET OLD;
  ARRAY A{10} VAR1-VAR10;
RUN;

Trong đó, VAR1, VAR2, …, VAR10 là các biến đã có sẵn trong dữ liệu OLD. Lúc này, biến VAR1 có thể được gọi bằng A{1}, VAR2 có thể được gọi bằng A{2}, … Lưu ý rằng có thể không cần khai báo độ dài của array như sau:

DATA NEW;
  SET OLD;
  ARRAY A{*} VAR1-VAR10;
RUN;

Tạo array với các loại biến đặc biệt

Để tại array chứa toàn bộ các biến numeric/ character, ta làm như sau:

DATA NEW;
  SET OLD;
  ARRAY NUM{*} _NUMERIC_;
  ARRAY CAT{*} _CHARACTER_;
  ARRAY ALL{*} _ALL_;
RUN;

Với lệnh trên, array NUM sẽ chứa toàn bộ các biến có định dạng numberic và array CAT sẽ chứa toàn bộ các biến có định dạng character. Tương tự như vậy array ALL sẽ chứa toàn bộ các biến trong dữ liệu.

Để tạo array với các biến bắt đầu bằng ký tự đặc biệt, ta làm như sau:

DATA NEW;
  SET OLD;
  ARRAY A{*} VAR:;
RUN;

Với cú pháp như trên, tất cả các biến có tên bắt đầu bằng VAR sẽ được chứa vào array A. Các biến này có thể tên là VAR1, VARA, VAR_B, … không nhất thiết phải theo sau bằng số. Lưu ý rằng, các biến được gán vào array theo thứ tự xuất hiện ở dữ liệu. Như ví dụ trên, VAR1 là A{1}, VARA là A{2}, …

Tính toán với array

Để tính toán với array, ta sử dụng số chỉ vị trí. Với ví dụ ban đầu, ta xử lý bằng Array như sau:

DATA NEW;
  SET OLD;
  ARRAY AREA{6} ;
  ARRAY W{6} WIDTH1-WIDTH6;
  ARRAY H{6} HEIGHT1-HEIGHT6;
  DO I=1 TO 6;
    AREA{I}=W{I}*H{I};
  END;
RUN;

Có thể làm cách khác như sau (nếu các biến WIDTH, HEIGHT đã được xếp theo thứ tự từ 1 đến 6).

DATA NEW;
  SET OLD;
  ARRAY W{*} WIDTH:;
  ARRAY H{*} HEIGHT:;
  N=DIM(H);
  ARRAY AREA{N} ;
  DO I=1 TO N;
    A{I}=W{I}*H{I};
  END;
RUN;

Chú ý rằng cú pháp DIM{A} trả về độ dài của array A.

Ví dụ sau đây thay thế giá trị missing trong tất cả các biến numeric bằng 0

DATA NEW;
  SET OLD;
  ARRAY A{*} _NUMERIC_;
  DO I=1 TO DIM(OF A);
    IF A{I}=. THEN A{I}=0;
  END;
RUN;

Các hàm với array

SAS cung cấp các hàm sau đây để tính toán các chỉ số thống kê của Array. Chú ý rằng các hàm này bỏ qua giá trị missing trong các phần của của array.

  • SUM(OF A{*}) tổng các phần của các phần tử của array A.
  • MAX(OF A{*}), MIN(OF A{*}), MEAN(OF A{*}), VAR(OF A{*}) giá trị lớn nhất, nhỏ nhất, trung bình, variance của các phần tử của array A.
  • CMISS(OF A{*}) số lượng phần tử missing của array A.
  • RANGE(OF A{*}) chênh lệch giữa giá trị lớn nhất và giá trị nhỏ nhất của các phần tử trong array A (MAX(OF A{*})-MIN(OF A{*})).

Related Docs

Overview
Data Step
Data Aggregation
Data Visualization
Proc SQL
Variable Analysis
Macro
Model Regression
Variable Selection
Model Assessment