BookmarkSubscribeRSS Feed

[SAS 프로그래밍] SAS/IML(interactive matrix language) DO statement & LOC function

Started ‎06-18-2020 by
Modified ‎06-18-2020 by
Views 155

 안녕하세요이번시간에는 IML문에서 프로그래밍을 하는데 많이 쓰이는 Do명령문과 Loc함수에 대해 알아보겠습니다.

 

 

 

DO statement

 SAS dataset을 다룰 때와 마찬가지로 행렬에서 DO END문을 사용하면 반복되는 명령문들을 한번에 다룰 수가 있습니다예를 들어 다음과 같은 행렬a, b가 있을 때

 

ayHDvwH9z4QAAAABJRU5ErkJggg__.png

 

APqN74WcCRBgAAAAAElFTkSuQmCC.png

 

 

 

행렬b의 원소들을 행렬a의 1행의 원소들로 바꾼다면 아래의 방법처럼 하나씩 명령문을 작성 할 수도 있지만

 

QEQPQwZDh6JDKUgIxDdIgGBAxUeCQ6RAMCBir_AWvU2ddCz5AlAAAAAElFTkSuQmCC.png

 

Vh5IdRrMolcdj2ypOiUPIO5foFsjYSSd6hPBH1Lztg4h3K15K0BsDEy6DxxxUlUtntcVYpB551jtWfBZTc4kRlSqEHXuL0ienIZZ.png

 

 

 

그것 보다는 Do 명령문을 사용하는 것이 편리합니다.

 

EiTicQLiCHzTz3PqR_LMpAAAAAElFTkSuQmCC.png

 

Vh5IdRrMolcdj2ypOiUPIO5foFsjYSSd6hPBH1Lztg4h3K15K0BsDEy6DxxxUlUtntcVYpB551jtWfBZTc4kRlSqEHXuL0ienIZZ.png

 

 

 

 

하지만, 모든 경우에 Do 명령문이 가장 효율적인 프로그래밍 방법이라고 단정지을 수는 없습니다. 불필요하게 Do명령문을 사용한다면 오히려 과정이 더 복잡해지는 결과를 초래할 수도 있습니다. 앞서 만든 행렬a의 각 열의 평균을 구하는 세가지 방법을 예로 들어 보겠습니다.

 

 

EPB7iyTkDiPs8AAAAASUVORK5CYII_.png

 

E_nL33GC2j_44ImHeHApwJWN_kM8uBTgykb9IR5cCnBl8wiIFJKQ3rs95wAAAABJRU5ErkJggg__.png

Do명령문을 두번이나 사용하였지만 간단해 보이지 않고 복잡하고 비효율적으로 보입니다.

 

 

 

 

o8D3Gos5oB1zcqV4OAfTBQM5BironAgAGvNKfsEIFuMDDCALLmCHtou5ABSHMhuTA9wgCkOcIe2i5kANJcSC5MjzAAaY6wh7YLGf.png

 

E_nL33GC2j_44ImHeHApwJWN_kM8uBTgykb9IR5cCnBl8wiIFJKQ3rs95wAAAABJRU5ErkJggg__.png

Do명령문을 하나로 줄여 앞선 방법보다는 효율적이지만 이해가 쉽지는 않습니다.

 

 

 

 

xyVWLnq6ELvibyM6Th1iM4QDiXjqYKUDf6X_XPHY7T5_jhIMyluggypKLELgLWp0xNGny8igl5zhno5mrf_V0Wt5qtoKdIFOIpBk.png

 

gHX1W8ygXX29QAAAABJRU5ErkJggg__.png

위의 두 방법과 같은 결과가 나왔지만 앞서 복잡한 과정과 달리 mean함수를 사용하여 코드는 훨씬 간단해 졌습니다.

 이렇듯 Do문이 프로그래밍에서 많이 쓰이긴 하지만 대체할 다른 쉬운 방법이 없을 경우에만 사용을 해야 합니다.

 

 

 

 

 

 

 

LOC function

Loc함수는 행렬에 속한 원소들의 위치를 표시해주는 기능을 합니다, 0은 결측값으로 취급하여 위치지정에서 제외됩니다.. 예를 들어 0값을 두개 포함한 1x6크기의 행벡터가 있을 때 loc함수를 사용하면 0을 제외한 나머지 원소들이 몇 번째 열에 위치했는지 출력됩니다.

 

nuHXEs_054tYZcMQdcWsErO05xx1xawSs7TnHHXFrBKztOcetEf8LSKhR8Ckga_AAAAAASUVORK5CYII_.png

 

AT0hXrOKx6J_AAAAAElFTkSuQmCC.png

 

 

 

 

Loc함수의 이런 기능은 결측값을 다룰 때 유용하게 사용됩니다예를 들어 다음과 같은 결측치가 포함된 행벡터 miss가 있을 때 Loc함수를 사용하여 결측치를 제거한 새로운 행벡터를 만들 수 있습니다.

 

WQwuxLpkjHj0sMWkp1CGSvkTqvHjiLJ1KdSx_IYBKXV0QmIcJqxiLSimCS_T9zKa_JUThdVwAAAABJRU5ErkJggg__.png

 

VoQUiXVskvgAAAABJRU5ErkJggg__.png

 

 

 

 

WbY7duxuGUJKUNawue983ihtJ5uFsm22Y1qyZpvO13DHyPIWiNXzvIFOPJUBoue93_9kyi0D9LDpFnoCy2EzcA2keCleYAYCQ8_e.png

 

AVKlgaSd4AAAAASUVORK5CYII_.png

Loc함수로 결측치가 아닌 원소들의 위치를 출력한 다음이 위치들을 다시 miss행벡터에 적용하여 결측치가 제거된 새로운 nomiss행벡터를 생성하였습니다.

 

 

 

 

Loc 함수는 또한 행렬내에서 조건을 만족하는 개체를 찾을 때에도 사용됩니다예를 들어 Sashelp라이브러리의 Class데이터셋을 행렬로 불러 들어와서 Height 60미만 Weight 90미만인 조건을 만족하는 개체의 번호를 알아보겠습니다.

 

PghrP0vP4iOqIV0J3wvOrBz1_8d46CvAR8bgDxJSjzKCRYJhBtIPWgj7LTk3LpldzfQi6uoPY9MBPYPUOOMIHIHBjBPD86hsnF6E.png

 

sXbLFPoooa4RYAAAAASUVORK5CYII_.png

Height 60미만 Weight 90미만인 조건을 만족하는 개체의 번호가 출력된 것을 확인하였습니다.

 

 

 

마치며

오늘은 IML문에서 프로그래밍을 할 때 많이 쓰이는 Do명령문과 Loc함수에 대해 알아보았습니다. Do명령문의 경우필요한 곳에 쓰이면 반복되는 명령문을 한번만 사용하여 효율적이지만 보다 쉬운 방법이 있다면 오히려 과정을 복잡하게 만들 수도 있기 때문에 이를 판단하기 위한 연습이 필요합니다.

 

 

 

 

 

 

 

Reference

https://support.sas.com/resources/papers/proceedings13/144-2013.pdf

http://support.sas.com/documentation/cdl/en/imlug/67502/HTML/default/viewer.htm#imlug_langref_sect23...

 

 

 

 

Version history
Last update:
‎06-18-2020 01:51 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

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.


Register now!

Article Labels
Article Tags