我对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)
索引?
答案 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语句。