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

SAS Do循环:如何引用外部单元格值,sas,do-loops,Sas,Do Loops,关于SAS中的Do循环,我有两个问题。 假设我有三个数据集: (1) 一个名为last的数据集,一个名为last\u observation: last_observation 150 (2) 第二个数据集包含两列观测值: Time ID 34200 1 34201 2 34210 3 34213 4 . . . . . . 36000 150 Purchases_unit Time 1000 34200 20

关于SAS中的Do循环,我有两个问题。 假设我有三个数据集: (1) 一个名为
last
的数据集,一个名为
last\u observation

last_observation
150
(2) 第二个数据集包含两列观测值:

Time    ID
34200   1
34201   2
34210   3
34213   4
.       .
.       .
.       .
36000   150
Purchases_unit Time
1000           34200
2000           34210
1243           34211
3040           34300
.              .
.              .
1000           36000
请注意,我的时间增量随机增加,有925个观察值。在我的1X1数据集中找到了相同的数字(1)

(3) 第三个数据集
具有两列观察值:

Time    ID
34200   1
34201   2
34210   3
34213   4
.       .
.       .
.       .
36000   150
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;
数据\u空\u;
放在最后;
其中last=last;
调用symput('last_obs',last);跑
%i=1到&“最后一次”*因此,一个1到150个ID的循环
数据需求&i;
集有;

如果时间,我将使用哈希对象来查找所需的值

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语句。

!谢谢你的哈希代码。这将是我第一次实现哈希对象。我还有一个问题,如何在哈希对象中包含额外的
IF
语句?例如,在
if time>=time\u i
我想包括
如果时间=0
那么大于或等于
time\u I
的观测值以及
time=0
的观测值。我怎样才能做到?我尝试简单地添加
if time=0
,但我剩下的观测值为零,这是因为我不能同时使用
time=0
time>=time\u I
进行单个观测
subseting if语句将所有计算值保持为TRUE。只需在上面添加任何附加条件。你也可以回到你的“if-then-delete”,啊,我知道我在代码实现中的错误在哪里了。再次感谢!