0

個人の「ステータス」を説明する週ごとの変数の範囲があります (2010 年の第 1 週から 2012 年の第 17 週まで)。

変数は次の式で与えられます。

y_1001, y_1002,...y1052, y1101, y1102,......y_1217

変数の期間を次のように定義します。

%let period = y_1001-1052 y_1101-y1148;

また、開始日と終了日として与えられた治療期間があります。私の課題は、患者が治療を中止してから 1 週間後のy_ 変数によって与えられるステータスを見つけることです。

私は SAS にあまり詳しくありませんが、私の考えは、週のカウンターに基づいて正しい y_ 変数を "選択" することでした。たとえば、期間の開始 (2010 年の第 1 週) からの週数をカウントし、治療は終了します。

このように治療が終わるまで数週間かかります

week_count = 1 + intck( 'week.2', '1JAN2010'd, end_treatment_date, 'd');

しかし、このカウントに基づいて対応する y_ 変数を取得するにはどうすればよいでしょうか?

period 変数をループして各人の week_count 変数に対応する数を選択する方法について無益な検索を行った後、私は別の方法で行くことを考えました...このようなことを言います。

array weeks(*) .
do i = 1 to dim(weeks) by 1;
  if week_count = i then end_status = y_10&i;
end

...しかし、配列の次元と週数および年数との間に不一致があることを考慮に入れるための変更があります。

しかし、私の課題は、次の部分を機能させることです...

if week_count = i then end_status = y_10&i;

SAS がループ インデックスに基づいて正しい y_ 変数を選択するようにするにはどうすればよいですか? これは非常に単純な問題のように思えますが、どういうわけか解決策を見つけることができませんでした。正しい y_ 変数を定義する際に変数 "i" を入力として使用する方法はありませんか?

誰かがいくつかのヒントを投げることができれば、本当に感謝しています。

4

2 に答える 2

2

私はあなたが欲しいと思います:

if week_count = i then end_status = weeks{i};
于 2012-06-28T16:53:11.720 に答える
0

VVALUEX は SAS ではあまり知られていない関数で、SAS 変数名から値を抽出するのに役立ちます。ここでの問題は、1 月 1 日から治療終了までの週数を指定して、SAS 変数名を作成することです。以下の例のアイデアを使用することで、すべての観察に DO LOOP を使用することを避けることができます。

data _null_;
    end_treatment_date = "09FEB2010"d;
    y_1007 = 'D';
    status = vvaluex(compress("y_" || substr(strip(year(end_treatment_date)), 3, 2) || put(1 + intck("week.2", "01JAN2010"d, end_treatment_date), z2.)));
    put status;
run;

変数名は次のように構成されます。最初に文字列「y_」を取得し、以前と同様のロジックを使用して、年の下 2 桁と週を変数 week_count に追加します。必要な変数を取得し、VVALUEX を適用して値を取得します。何百万もの観測がある場合、すべての観測に対して DO LOOP を実行するのは非効率的です。

于 2012-06-29T04:34:15.763 に答える