안녕하세요. 오늘은 IML을 사용하여 SAS dataset 을 행렬화 하는 방법에 대해 알아 보겠습니다.
Open & Read a dataset
SAS dataset을 행렬로 불러오기 위해서는 우선 IML의 USE statement가 필요합니다. 명령문에 사용되는 기본포맷은 다음과 같습니다.
우선 불러올 SAS dataset을 지정합니다. 그리고 뒤에 오는 옵션들은 필요에 따라 선택적으로 쓰일 수 있습니다. VAR옵션의 경우 dataset에서 가져올 변수를 지정하는 역할을 합니다. WHERE옵션은 조건을 생성하여 조건에 만족하는 관측값만을 골라서 불러오는 역할을 합니다. 마지막으로 NOBS옵션은 불러오는 dataset의 관측값들의 전체 개수를 저장하고 싶을 때 개수를 저장할 변수를 따로 지정하는 역할을 합니다. 그리고 SAS dataset을 지정할 때 DATA단계에서 쓰이는 dataset 옵션을 똑같이 사용하여 불러올 dataset의 변수를 선택 또는 제거, 관측치의 시작 또는 끝 지점 등을 지정할 수도 있습니다.
USE statement로 사용할 데이터셋을 지정하는 단계를 마친 후에는 READ statement 를 사용하여 행렬로 저장해야 합니다. 기본 포맷은 다음과 같습니다.
READ statement 바로 뒤에는 dataset에서 읽을 관측개체의 범위를 지정할 수 있습니다. ALL, CURRENT, NEXT, POINT 등을 사용할 수 있는데 일반적으로 모든 개체를 읽는 ALL을 사용합니다.
경우에 따라 특정한 개체의 번호를 지정하여 원하는 개체만을 읽어낼 때는 POINT옵션을 사용하면 됩니다.
그리고 범위지정을 생략하게 되면 CURRENT로 지정하는 것과 같이 현재 개체를 읽게 되는데 만약 dataset을 open 하여 처음 read하는 경우에는 첫번째 개체가 읽히게 되고 이전에 읽힌 기록이 있는 경우는 마지막에 읽힌 개체를 읽게 되는 것입니다.
행렬 a, c의 경우 read문에서 똑같이 range를 생략하였지만 a의 경우 이전에 dataset을 read한 적이 없기 때문에 첫번째 개체를 read하였지만 c의 경우는 바로 앞서 range를 all로 지정하여 모든 개체를 읽은 기록 때문에 마지막 개체를 읽은 것입니다. 이외에도 NEXT나 AFTER등의 옵션단어 등을 사용하여 개체의 range를 지정할 수 있습니다.
VAR옵션은 USE statement에서와 마찬가지로 읽을 변수를 지정하는 역할을 합니다. 중괄호 안에 원하는 변수명을 직접 입력할 수도 있고
_NUM_, _CHAR_등의 표현을 사용하여 숫자변수 혹은 문자변수만을 골라서 읽어 들일 수도 있습니다.
만약 생략하게 될 경우 모든 변수를 읽는 _ALL_과 같이 작용하게 됩니다.
WHERE 옵션은 지정된 조건을 만족하는 개체만을 읽는 역할을 합니다. VAR 옵션 과 WHERE 옵션은 USE문과 READ문에 공통으로 있고 기능도 같기 때문에 두 명령문 중에 한군데만 사용해도 됩니다.
INTO옵션은 읽은 변수들을 하나의 행렬로 묶어서 저장하는 역할을 합니다. INTO옵션을 사용하지 않는다면 dataset에서 읽은 개체들은 변수별로 각각 다른 열벡터로 저장됩니다. INTO 옵션을 사용하여 저장될 행렬명을 지정해주면 VAR, WHERE 옵션을 통해 읽힌 개체들이 각각의 열벡터로 저장되는 것이 아닌 하나의 행렬로 저장됩니다. 하지만 숫자 열벡터와 문자 열벡터는 하나의 행렬로 묶을 수 없습니다. 만약 VAR옵션이 생략된 상태에서 INTO옵션을 사용하게 될 경우 VAR 옵션을 통해 숫자변수(_NUM_ )만을 읽는 것과 마찬가지로 dataset에서 숫자변수만을 행렬에 저장하여 숫자행렬이 생성 됩니다. 문자변수를 행렬로 만들고 싶다면 VAR옵션을 사용하여 문자변수(_CHAR_)만을 읽는 조건을 걸어 주어야 합니다.
INTO옵션에는 저장되는 행렬의 행명칭과 열명칭도 지정할 수 있는 기능이 있습니다. INTO+행렬명 다음 대괄호 안에 ROWNAME 또는 COLNAME을 추가하여 행명칭과 열명칭을 지정할 수도 있습니다. Rowname의 경우 저장되는 행렬의 행의 수와 같은 열벡터 즉, nxp 크기의 행렬을 저장할 경우에는 nx1 크기의 열벡터 혹은 변수를 지정하여 행명칭을 부여할 수 있고 colname의 경우 varnames를 사용하면 변수명을 그대로 열명칭으로 지정할 수 있습니다.
마치며
오늘은 use문과 read문을 사용하여 sas dataset을 사용하여 행렬을 만드는 방법에 대해 알아 보았습니다. 다음시간에는 반대로 행렬로 존재하는 data를 sas dataset으로 변환하여 저장하는 방법에 대해 알아보겠습니다.
Reference
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.