0

SAS の Do ループに関して 2 つの質問があります。3 つのデータセットがあるとします: (1) と呼ばれるlast1 つの観測値で呼び出される 1 つのデータセットlast_observation:

last_observation
150

(2) 観測の 2 つの列を持つ 2 番目のデータセット:

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

時間の増分がランダムに増加し、観測値が 925 になっていることに注目してください。私の 1X1 データセット (1) にあるのと同じ数です。

(3) have2 列の観測値を含む 3 番目のデータセット:

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)2 番目のデータセットの時間列を参照し、(i) は時間列のセル添字です。だから私の2つの質問は次のとおりです。

(1) これは機能しますか?:関数%Do i=1 to &'last_obs';を使用すると? (2)インデックスsymputを実装するにはどうすればよいですか?time(i)

4

1 に答える 1

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 ステートメントを使用します。

于 2013-09-03T00:32:14.460 に答える