* 질문 : 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-∫
do i =j to j-1+∫
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+∫
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
이렇게 나와야 하거든요..
규칙은 있는데... 어떻게 해야 할지 전혀..모르겠어요..
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.