BookmarkSubscribeRSS Feed

[SAS 프로그래밍 고수 백승민] [관측치 추출] 관측치를 이동하면서 일정 개수의 관측치 추출-LAG, ARRAY, POINT 방식 비교(최홍규 이사)

Started ‎06-11-2020 by
Modified ‎06-11-2020 by
Views 124

* 질문 : http://cafe.daum.net/statsas/B3m/13387

 1. LAG 방식(최홍규 님)

 /*

매크로를 이용해서 lag 함수를 동적으로 생성시켜서 뽑으면 될 것 같네요..

(매크로 실력이 딸려서... ㅠㅠ  조금 지저분해 보이네요..)

*/

data test;
input x @@;
cards;
1 5 2 3 4 6 7 8 9
;
run;


%macro x(s);  * s 는 샘플사이즈..;

 

data test2;
set test;

 

%do i=1 %to &s-1;  * if 의 then 이하에서 lag함수를 쓰면 안되기 때문에 샘플사이즈에 따라 미리 lag 값을 생성합니다.;
    x&i = lag&i(x);
%end;

 

seq = _n_ + 1 - &s; * 처음부터 순서대로 읽어서 샘플이 완성되는 순간  seq는 양수가 됩니다;

 

if seq>0 then do;    * 샘플이 다 완성되면, 앞서 생성해 놓은 lag 값을 출력합니다.;
    %do i=&s-1 %to 1 %by -1;
        y=x&i;
        output;
    %end;
    y=x;
    output;
end;

 

keep seq y;

run;
%mend;

 

%x(4);  * 샘플사이즈가 4인 경우;

proc print ;run;

 

 

2. ARRAY 방식(최홍규 님)

*******************;

/*

가만 생각해보니까 array 를 쓰는게 조금 더 간단해 보이네요..

*/


%let s=4;  * 샘플사이즈;

 

data test3;set test;
array s(&s);
retain s;

 

if _n_ < &s then s(_n_)=x;  * 샘플이 완성될 때까지 array에 채웁니다.;
else do; * 한 obs 읽으면서 array 를 모두 출력하고, 동시에 array 원소들을 하나씩 이동시켜서 다음 출력에 대비합니다;
    seq+1;
    s(&s)=x;
    do i=1 to &s;
        y=s(i);
        output;
        if i<&s then s(i)=s(i+1);
    end;
end;

 

keep seq y;
run;

 

proc print;run;

 

3. POINT 방식(백승민)

 

* 최이사님께서 작성하신 프로그램을 보고서 프로그램을 변경해 보았습니다.

data test;
input x @@;
cards;
1 5 2 3 4 6 7 8 9
;
run;

 

* SET문을 통해서 원본 테이블에서 데이터를 추출하는 방법으로 구현을 해 보았습니다;
* POINT문장을 통해서 TEST 테이블에서 초기의 데이터 읽는 위치를 변경하여서 관측치를 4개씩 읽는 방식입니다.;

%let int=6;
data back;
if _n_=1 then
 do j=1 to kk+1-&int;
    do i =j to j-1+&int;
       set test point=i nobs=kk;
    output;
    end;
 end;
run;

 

 

4. POINT 방식 개선(최홍규님)

/*

아... 어쩐지 뭔가 부족해 보이더라니~

point 가 있었군요. ^^ 

random access 속도문제만 뺀다면 훨씬 깔끔하고 효율적인거 같네요.

저도 방장님이 작성해주신 프로그램을 보고 조금 더 간략하게 만들어 봤습니다.. ^^

*/


%let int=6;
data back;

j=_N_;

do i=j to j-1+&int;
   set test point=i nobs=kk;
   output;
end;
if i > kk then stop;

run;
 

* 질문

자료를 추출하려고 하는데.. 도움...부탁드려요.

 

예를 들어서

1,5,2,3,4

의 5개의 자료에서,

2개씩 뽑는다고 한다면,

1,5 ;  5,2;  2,3;  3,4

이렇게 나와야 하고요.

3개씩 뽑는다고 한다면,

1,5,2;  5,2,3; 2,3,4;

이렇게 나와야 하고,

4개씩 뽑는다고 한다면,

1,5,2,3;  5,2,3,4

이렇게 나와야 하거든요..

 

규칙은 있는데... 어떻게 해야 할지 전혀..모르겠어요..

Version history
Last update:
‎06-11-2020 05:44 AM
Updated by:
Contributors

sas-innovate-white.png

🚨 Early Bird Rate Extended!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.

 

Lock in the best rate now before the price increases on April 1.

Register now!

Article Labels
Article Tags