まず、通常、Base SAS は実際にはこのようには機能しないことを提案します。できないわけではありませんが、通常、特定の行を指定しなくてもほとんどの問題を解決できます。
したがって、この回答は明示的な問題を解決しますが、実際のシナリオではおそらく役に立たないでしょう。通常、現実の世界では、結合する「行番号」以外の一致キーまたはその他の要素があり、結合すると、はるかに効率的に実行できます。また、この操作をより便利にする方法でデータ構造を再配置することもできます。
とはいえ、あなたが与える具体的な例は些細なことです:
data have;
input ID Number;
datalines;
1 2
2 5
3 6
4 1
;;;;
run;
data want;
set have;
_t = 3;
set have(rename=number=number3 keep=number) point=_t ;
number2=number+number3;
run;
R に多少似ている SAS/IML (SAS のマトリックス言語) を使用している場合、この操作を実行する可能性と実行方法の両方において、これは非常に異なる話です。
proc iml;
a= {1 2, 2 5, 3 6, 4 1}; *create initial matrix;
b = a[,2] + a[3,2]; *create a new matrix which is the 2nd column of a added
elementwise to the value in the third row second column;
c = a||b; *append new matrix to a - could be done in same step of course;
print b c;
quit;
最初の観測でこれを行うには、はるかに簡単です。
data want;
set have;
retain _firstpoint; *prevents _firstpoint from being set to missing each iteration;
if _n_ = 1 then _firstpoint=number; *on the first iteration (usually first row) set to number's value;
number = number - _firstpoint; *now subtract that from number to get relative value;
run;
これについてもう少し詳しく説明します。SAS はレコードごとのレベルで動作し、各レコードは DATA ステップで個別に処理されます。(一方で、PROC はこのように動作しない場合がありますが、多くはある程度のレベルで動作します)。SAS は、SQl や同様のデータベースと同様に、行が「最初」、「2 番目」、または「n 番目」であることを真に認識しません。ただし、SQL とは異なり、現在の並べ替えに基づいて、そうであると見なすことができます。POINT= ランダム アクセス方式は、そのための 1 つの方法です。
ただし、ほとんどの場合、データの順序付けに関連するものではなく、データ内の何かを使用して何をしたいのかを判断します。POINT= メソッドと同じことを行う方法を次に示しますが、ID の値を使用します。
データが欲しい; n = 1 の場合、 have(where=(ID=3) rename=number=number3); を設定します。セットは持っています。number2=number+number3; 走る;
データ ステップの最初の反復 ( _N_
=1) で、Id=3 の HAVE から行を取得し、次に have から行を順番に取得します (実際にはこれを行います:)
*check to see if _n_=1; it is; so take row id=3;
*take first row (id=1);
*check to see if _n_=1; it is not;
*take second row (id=2);
... continue ...
SET ステートメント内の変数は自動的に保持されるため、NUMBER3 は自動的に保持され (yay!)、データ ステップ ループの反復間で欠落に設定されることはありません。値を変更しない限り、反復ごとにそのまま残ります。