2

次のデータセットがあります。

AGE    HSQ    PCT

65      1     0.7
65      2     0.2
65      3     0.1
66      1     0.5
66      2     0.25
66      3     0.25

[...]

私が必要とするのは、次の出力を取得することです。

AGE     P1    P2     P3

65     0.7    0.2    0.1
66     0.5    0.25   0.25

[...]

LAG私はそれを行うためにand FIRST.AGEorを採用するように言われましLAST.AGEた、そして私にはそれは良い戦略のようです. しかし、私は最終結果を得ることができません..私が使用している(間違った)コードは次のとおりです。

DATA OUTPUT;
  SET SAMPLE;
    BY AGE HSQ;
  IF LAST.AGE THEN DO;
    P1=LAG2(PCT);
    P2=LAG1(PCT);
    P3=PCT;
  END;
RUN;

しかし、それは以前の年齢のパーセンテージにジャンプします。これは私が必要とするものではありません..構文エラーはどこにありますか? ありがとう!

4

2 に答える 2

3

これはそれらを使用する割り当てであると言われましたか、それともこれが最も簡単な方法であると言われましたか?

これを行う最も簡単な方法は、PROC TRANSPOSE です。

data have;
input AGE    HSQ    PCT;
datalines;
65      1     0.7
65      2     0.2
65      3     0.1
66      1     0.5
66      2     0.25
66      3     0.25
;;;;
run;

proc transpose data=have out=want prefix=P;
by age;
var pct;
id hsq;
run;

LAG は、あなたが思っているようには機能しませ。前の行の値は得られません。代わりにキューを作成し、(argument) の現在の値を取得して、キューの以前の値を返します。したがって、そのような IF ステートメントでは使用できません。

何らかの理由でデータステップでこれを行う必要がある場合は、次のようにします。

data want;
array p[3];
do _n_ = 1 by 1 until (last.age);
    set have;
    by age;
    p[hsq]=pct;
end;
keep p1-p3 age;
run;

ラグやラグの概念を使用する理由は本当にありません。場所に属する値に出くわしたのと同じように、それらをその場所に割り当て、last.age をヒットすると出力します。

LAG機能を削除するSASwareのリクエストに参加したい人はいますか?

于 2012-10-10T14:09:27.853 に答える
2

楽しみのために、元の質問に対する直接の回答(これを行う方法を示すため):

DATA want;
  SET have;
    BY AGE HSQ;
    p1=lag2(pct);
    p2=lag1(pct);
    p3=pct;
    if last.age then output;
run;

これは、遅延を 6 回計算し、結果のうちの 2 つしか出力しないため、多くの余分な作業 (もちろん、CPU 時間の数ナノ秒を意味します) を処理します。また、HSQ が正しい値であることを確認しないため、少し「危険」です。つまり、ある年齢のエントリを 1 つ見逃して、2 行しかない場合は、前の年齢の HSQ を持っていることになります。 =3 の P1 の値。これはおそらく望ましくありません。

究極のポイントは、LAG を「前の行のレコード」の代用として使用する場合は、条件付きブロックの外に置く必要があるということです。すべての行のラグを計算し、結果を条件付きで使用します (この場合、出力は条件付きで使用されます)。

于 2012-10-10T15:18:55.663 に答える