4

私はSASに非常に慣れていないので、他の言語で利用できるいくつかの基本的なことを理解しようとしています。

私はテーブルを持っています

ID  Number
--  ------
1   2
2   5
3   6
4   1

Numberの1つの観測値を他の観測値と合計する新しい変数を作成したいと思います。

Number2 = Number + Number[3]

ID  Number  Number2
--  ------  ------
1   2       8
2   5       11
3   6       12
4   1       7

Numberの3番目の観測値を取得し、これをNumber新しい変数の各観測値に追加するにはどうすればよいですか?

4

2 に答える 2

4

これを行うにはいくつかの方法があります。これは、SASPOINT=オプションを使用したものです。

data have;
   input ID  Number;
datalines;
1   2
2   5
3   6
4   1
run;

data want;
   retain adder;
   drop adder;
   if _n_=1 then do;
      adder = 3;
      set have point=adder;
      adder = number;
      end;

   set have;
   number = number + adder;
run;

RETAINandステートメントはDROP、追加する値を保持する一時変数を定義します。 RETAINは、データ ステップで毎回値が欠落に再初期化されないことをDROP意味し、その変数を出力データ セットに含めたくないことを意味します。

このPOINT=オプションを使用すると、SAS データセットから特定の観測を読み取ることができます。この_n_=1部分は、そのコードのビットを 1 回だけ実行し、変数adderを 3 番目の観測値に割り当てる制御メカニズムです。

次のセクションでは、データ セットを一度に 1 つのオブザベーションで読み取り、変更を追加して適用します。

同じデータ セットが 2 回読み取られることに注意してください。便利な SAS 機能。

于 2013-03-19T21:06:20.520 に答える
2

まず、通常、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!)、データ ステップ ループの反復間で欠落に設定されることはありません。値を変更しない限り、反復ごとにそのまま残ります。

于 2013-03-19T21:13:17.497 に答える