SAS Do Loop:如何引用外部单元格值

时间:2013-09-02 23:45:41

标签: sas do-loops

我对SAS中的Do Loops有两个问题。 假设我有三个数据集: (1)一个名为last的数据集,其中一个名为last_observation

last_observation
150

(2)第二个数据集,包含两列观察结果:

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

请注意,我的时间增量随机增加并有925个观测值。在我的1X1数据集(1)中找到相同的数字。

(3)第三个数据集have,包含两列观察结果:

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

我想做的是以下内容:

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;

time(i)指的是第二个数据集中的时间列,(i)是时间列的单元格下标。所以我的两个问题是:

(1)这会有效吗?%Do i=1 to &'last_obs';如果我使用symput函数? (2)如何实现time(i)索引?

1 个答案:

答案 0 :(得分: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语句。