■ Simplifying Programs with Arrays
데이터 분석 전, 숫자 변수에 로그를 취하거나 0을 결측값으로 변경해 많은 변수에 대해 동일한 작업이 필요할 수 있습니다.
assginment statement나 IF문을 작성할 수 있지만 변환할 변수가 많은 경우 array를 사용하면 프로그램이 단순화되고 단축됩니다.
array를 사전적으로 정의하면, '유사한 항목의 정렬된 그룹'입니다.
예를 들면, 지역 쇼핑몰에 선택할 수 있는 다양한 상점이 있다고 생각할 수도 있습니다.
SAS에서 array(배열)는 변수 그룹입니다.
모두 숫자이거나 모두 문자인 한 배열을 원하는 변수 그룹으로 정의할 수 있습니다.
여기서 변수는 데이터 세트에 이미 존재하는 변수일 수도 있고 생성하려는 새 변수일 수도 있습니다.
SAS에서 배열은 DATA 단계에서 ARRAY 문을 사용하여 정의됩니다.
ARRAY 문은 다음과 같은 일반 형식을 갖습니다.
ARRAY name (n) $ variable-list;
위의 명령문에서 name은 배열에 지정한 이름이고 n은 배열에 있는 변수의 수입니다.
(n) 다음은 변수 이름 목록입니다.
목록에 있는 변수의 수는 괄호 안에 주어진 수와 같아야 합니다. (괄호 대신 {} 또는 [ ]를 사용할 수 있습니다.)
이과 같이 변수의 수를 코드에 넣어야 하는 것을 explicit array(명시적 배열)이라고 하며 배열의 변수 수를 명시적으로 지정합니다.
$는 변수가 문자인 경우 필요하고 변수가 이전에 정의되지 않은 경우에만 필요합니다.
배열 자체는 데이터 세트와 함께 저장되지 않습니다. DATA 단계의 기간 동안만 정의됩니다.
데이터 세트의 변수 이름이나 SAS 키워드와 일치하지 않는 한 배열에 이름을 지정할 수 있습니다.
배열 이름 지정 규칙은 변수 이름 지정 규칙과 동일합니다(32자 이하여야 하며 문자 또는 밑줄로 시작하고 그 뒤에 문자, 숫자 또는 밑줄이 옴).
ARRAY store (4) Macys Penneys Sears Target;
배열 이름을 사용하여 변수를 참조하려면, 배열 이름과 해당 변수의 subscript를 제공 해야합니다.
위의 예를 보면 변수의 substript를 작성한 것을 확인할 수 있습니다. STORE(1)은 변수 Macys, STORE(2)는 변수 Penneys, STORE(3)은 변수 Sears, STORE(4)는 변수 Target입니다.
# Array Example
Array를 쉽게 이해하기 위해 설문조사 예시를 통해 알아보겠습니다.
WBRK 라디오 방송국은 사람들에게 10개의 다른 노래를 평가하도록 요청하는 설문조사를 실시하였습니다.
노래는 1에서 5까지의 등급으로 평가되며, 여기서 1 = 방송국이 켜질 때 방송국을 변경하고 5 = 방송국이 켜질 때 볼륨을 높입니다.
청취자가 노래를 듣지 않았거나 그것에 대해 언급할 생각이 없는 경우 해당 노래에 9가 입력되었습니다.
청취자의 거주 도시, 나이 및 10곡 모두에 대한 응답이 나열됩니다.
다음 프로그램은 모든 9를 결측값으로 변경합니다. (변수 이름은 노래 제목에 있는 단어의 첫 글자를 사용하여 지정됩니다.)
DATA songs;
INPUT City $ 1-15 Age domk wj hwow simbh kt aomm libm tr filp ttr;
ARRAY song (10) domk wj hwow simbh kt aomm libm tr filp ttr;
DO i = 1 TO 10;
IF song(i) = 9 THEN song(i) = .;
END;
datalines;
Albany 54 4 3 5 9 9 2 1 4 4 9
Richmond 33 5 2 4 3 9 2 9 3 3 3
Oakland 27 1 3 2 9 9 9 3 4 2 3
Richmond 41 4 3 5 5 5 2 9 4 5 5
Berkeley 18 3 4 9 1 4 9 3 9 3 2
;
PROC PRINT DATA = songs;
TITLE 'WBRK Song Survey';
RUN;
SONG 배열은 10개의 노래를 나타내는 INPUT 문에 나타나는 동일한 10개의 변수인 10개의 변수를 갖는 것으로 정의됩니다.
DO 문과 END 문 사이의 모든 문은 이 경우 배열의 각 변수에 대해 한 번씩 10번 실행됩니다.
변수 I은 인덱스 변수로 사용되며 DO 루프를 통해 매번 1씩 증가합니다.
DO 루프를 통해 처음으로 변수 I의 값은 1이고 IF 문은 IF song(1)=9 THEN song(1)=.;을 읽습니다. (IF domk=9 THEN domk=와 같습니다.)
두 번째로 I의 값은 2이고 IF 문은 IF song(2)=9 THEN song(2)=.;으로 읽습니다. 이는 IF wj=9 THEN wj=.;와 같습니다. 이것은 배열의 모든 10개 변수를 통해 계속됩니다.
array member SONG(1) ~ SONG(10)은 데이터 세트의 일부가 아니라 변수 I가 되었습니다.
(배열을 사용하는 대신 10개의 IF 문을 작성하고 동일한 결과를 달성할 수 있습니다.)
■ Using Shortcuts for Lists of Variable Names
SAS에서 프로그램을 작성하기 위해서는 변수 이름 목록을 작성해야 합니다.
ARRAYS를 정의할 때, MEAN 또는 SUM과 같은 함수를 사용하거나 SAS 프로시저를 사용할 때 사용할 변수를 지정해야 합니다.
예를 들어 100개의 요소가 있는 배열을 정의해야 하는 경우, 100개의 변수를 일일이 작성해야 합니다.
이러한 경우 간단한 방법으로, 일반 변수 목록을 사용할 수 있는 모든 곳에서 변수 이름의 축약된 목록을 사용할 수 있습니다.
함수에서 축약된 목록 앞에는 키워드 OF가 있어야 합니다(예: SUM(OF Cat8 - Cat12)).
그렇지 않으면 일반 변수 목록을 축약된 목록으로 바꾸면 됩니다.
● Numbered range lists●
동일한 문자로 시작하고 연속 숫자로 끝나는 변수는 번호가 매겨진 범위 목록의 일부가 될 수 있습니다.
숫자는 사이의 숫자 시퀀스가 완료되는 한 어디에서나 시작하고 끝날 수 있습니다.
예를 들어, 다음 INPUT 문은 변수 목록과 그 축약형을 보여줍니다.
# Variable list
INPUT Cat8 Cat9 Cat10 Cat11 Cat12;
# Abbreviated list
INPUT Cat8 - Cat12;
● Name range lists
Name Range list는 SAS 데이터 세트에 있는 변수의 내부 순서 또는 위치에 따라 다릅니다.
DATA 단계에서 변수가 나타나는 순서에 따라 결정됩니다.
DATA example;
INPUT y a c h r;
b = c + r;
RUN;
예를 들어, 다음 DATA 단계가 있는 경우 내부 변수 순서는 Y A C H R B가 됩니다.
이름 범위 목록을 지정하려면 첫 번째 변수를 입력하고 두 개의 하이픈을 입력한 다음 마지막 변수를 입력합니다.
다음 PUT 문은 명명된 범위를 사용하는 변수 목록과 해당 약어 형식을 보여줍니다.
# Varialbel list
PUT y a c h r b;
# Abbreviated list
PUT y -- b;
내부 순서가 확실하지 않은 경우 PROC CONTENTS를 POSITION 옵션과 함께 사용하여 확인할 수 있습니다.
LIBNAME mydir 'c:\MySASLib';
PROC CONTENTS DATA = mydir.distance POSITION;
RUN;
입력을 절약할 수 있지만, 프로그램을 이해하고 디버그하기 더 어렵게 만들 수 있는 단점이 있습니다.
● Special SAS name lists
특수 이름 목록인 _ALL_, _CHARACTER_ 및 _NUMERIC_는 SAS 데이터 세트의 모든 변수, 모든 문자 변수 또는 모든 숫자 변수를 원하는 모든 위치에서 사용할 수도 있습니다.
예를 들어 관찰에 대한 모든 숫자 변수의 평균을 계산하거나(MEAN(OF _NUMERIC_)) 관찰에 있는 모든 변수의 값을 나열합니다(PUT _ALL_;).
# Special name lists Example
위에 사용했던 라디오 방송국 WBRK 설문조사 데이터를 활용합니다.
이전 예시와 달리, 원래 변수를 변경하는 대신에 새 결측값이 있는 새 변수(Song1~Song10)를 만듭들고, MEAN 함수를 사용하여 평균 점수를 계산합니다.
DATA songs;
INPUT City $ Age domk wj hwow simbh kt aomm libm tr filp ttr @@;
ARRAY new (10) Song1 - Song10;
ARRAY old (10) domk -- ttr;
DO i = 1 TO 10;
IF old(i) = 9 THEN new(i) = .;
ELSE new(i) = old(i);
END;
AvgScore = MEAN(OF Song1 - Song10);
datalines;
Albany 54 4 3 5 9 9 2 1 4 4 9
Richmond 33 5 2 4 3 9 2 9 3 3 3
Oakland 27 1 3 2 9 9 9 3 4 2 3
Richmond 41 4 3 5 5 5 2 9 4 5 5
Berkeley 18 3 4 9 1 4 9 3 9 3 2
;
PROC PRINT DATA = songs;
TITLE 'WBRK Song Survey';
RUN;
ARRAY 문 모두 축약된 변수 목록을 사용합니다. 배열 NEW는 번호가 매겨진 범위 목록을 사용하고 배열 OLD는 이름 범위 목록을 사용합니다.
반복 DO 루프 내에서 Song 변수(배열 NEW)는 원래 변수(배열 OLD)의 값이 9인 경우 누락된 것과 동일하게 설정됩니다.
DO 루프 이후에 MEAN 함수의 축약된 변수 목록을 사용하여 새 변수 AvgScore가 생성됩니다.
결과에는 OLD array(domk, wj, ... ttr) 및 NEW array(Song1 - Song10)에 모든 변수가 포함됩니다.
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.