2013-09-02 1 views
0

SAS의 Do Loops와 관련하여 두 가지 질문이 있습니다. (1) 하나 개의 데이터 세트, 하나 명의 관찰 last_observation 전화로 last라고 :SAS Do Loop : 외부 셀 값을 참조하는 방법

Time ID 
34200 1 
34201 2 
34210 3 
34213 4 
.  . 
.  . 
.  . 
36000 150 

공지 사항 : 관찰의 두 열이

last_observation 
150 

(2) 두 번째 데이터 집합을 내가 세 가지 데이터 세트를 가지고 말 내 시간 증가는 무작위로 증가하고 925 회의 관측이 있습니다. 내 1X1 데이터 세트 (1)에 같은 번호가 있습니다. 관찰이 열

(3) 세 번째 세트 have는 :

Purchases_unit Time 
1000   34200 
2000   34210 
1243   34211 
3040   34300 
.    . 
.    . 
1000   36000 

내가하고 싶은 다음과 같은 경우 : time(i) 두 번째로 시간 열을 참조

data _null_; 
set last; 
where last=last; 
call symput('last_obs',last);run; 

%Do i=1 to &'last_obs'; *Hence a loop for 1 to 150 IDs 

data want_&i; 
set have; 
if time<time(i) then delete; 
run; 
%end; 
%mend; 

데이터 세트 및 (i)는 시간 열의 셀 첨자입니다. 따라서 내 두 가지 질문은 다음과 같습니다.

(1) symput 기능을 사용하면이 기능을 사용할 수 있습니까? : %Do i=1 to &'last_obs';? (2) time(i) 색인을 어떻게 구현할 수 있습니까?

답변

1

해시 객체를 사용하여 원하는 값을 조회합니다.

data last; 
last_observation= 4; 
call symput("last",last_observation); 
run; 

data time_id; 
input Time ID; 
datalines; 
34200 1 
34201 2 
34210 3 
34213 4 
;;; 
run; 

data purchases; 
input Purchases_unit Time; 
datalines; 
1000   34200 
2000   34210 
1243   34211 
3040   34300 
;;; 
run; 

%macro loopit(n); 
%do i=1 %to &n; 
data want_&i(drop=rc); 
set purchases; 
format time_i best.; 
retain time_i id; 
if _n_ = 1 then do; 
    declare hash lookup(dataset:"time_id(rename=(time=time_i))"); 
    rc = lookup.definekey("id"); 
    rc = lookup.definedata("time_i"); 
    rc = lookup.definedone(); 

    id = &i; 

    rc = lookup.find(); 
end; 

if time >= time_i; 
run; 
%end; 
%mend; 

%loopit(&last); 

첫 번째 관찰에서 조회 테이블에서 값을 찾습니다. 그 값을 유지하고 부분 집합 if 문을 사용하십시오.

+0

최고! 이 해시 코드를 가져 주셔서 감사합니다. 이것은 해시 객체의 첫 번째 구현이 될 것입니다. – Plug4

+0

또 다른 질문이 있습니다. 어떻게 해시 객체에 추가로 'IF'문을 포함시킬 수 있습니까? 예를 들어,'if time> = time_i; 옆에''time_i '를 포함하고 싶습니다.'time_i '보다 크거나 같은 관측치와'time = 0'이있는 관측치를 포함하고 싶습니다. 그렇게하려면 어떻게해야합니까? 나는 단순히'time = 0'을 추가하려고 시도했지만, 0 관찰을 남겼습니다. 왜냐하면 단일 관찰을 위해'time = 0'' time> = time_i'를 가질 수 없기 때문입니다. – Plug4

+1

'if time> = time_i 또는 time = 0; try '부분 집합 if 문은 TRUE로 평가되는 모든 값을 유지합니다. 거기에 추가 조건을 추가하기 만하면됩니다. 다시 을 삭제 한 다음 "; 너무. – DomPazz