4

私は次のようなデータセットを使用しています:

+----------+--------+-------+
| Variable | Level  | Value |
+----------+--------+-------+
| sexe     | men    |    10 |
|          | female |    20 |
| age      | 0-20   |     5 |
|          | 20-40  |     5 |
|          | 40-60  |    10 |
|          | >60    |    10 |
+----------+--------+-------+

そして、前の非空白セルを使用して「空白」セルを満たし、このようなものを取得したいと思います。

+----------+--------+-------+
| Variable | Level  | Value |
+----------+--------+-------+
| sexe     | men    |    10 |
| sexe     | female |    20 |
| age      | 0-20   |     5 |
| age      | 20-40  |     5 |
| age      | 40-60  |    10 |
| age      | >60    |    10 |
+----------+--------+-------+

主にLAG()関数を使用して、DATAステップでさまざまな可能性を試しました。アイデアは、セルが空のときに前の行を読み取り、それを埋めることでした。

DATA test;
   SET test;

   IF variable = . THEN DO;
      variable = LAG1(variable);
   END;
RUN;

そして、私は得た

+----------+--------+-------+
| Variable | Level  | Value |
+----------+--------+-------+
|          | men    |    10 |
| sexe     | female |    20 |
|          | 0-20   |     5 |
| age      | 20-40  |     5 |
|          | 40-60  |    10 |
|          | >60    |    10 |
+----------+--------+-------+

問題は、良い弦が常に 1 列上にあるとは限らないことでした。しかし、SAS が 1 行目と 3 行目に空白を入れた理由がわかりません。「If variable = .」と言ったので、この行を変更する必要はありませんでした。Python または R で for ループを使用してこれを行う方法は知っていますが、SAS では適切な解決策が見つかりませんでした。

「 CALL SYMPUT」と「 RETAIN 」を使用して変数内に文字列を入れようとしましたが、うまくいきませんでした。

これを行うには、シンプルでエレガントな方法が必要です。何か案が?

4

1 に答える 1

18

IF 内で LAG を使用してその結果を取得することはできません。LAG は実際には、あなたが考えているようには機能しません。RETAIN は私が言う正しい方法です:

DATA test;
   SET test;
   retain _variable;
   if not missing(variable) then _variable=variable;
   else variable=_variable;
   drop _variable;
RUN;

Lag は実際には前のレコードに移動してその値を取得しません。キューを設定し、LAG が呼び出されるたびに前からレコードを取り出し、後ろにレコードを追加します。これは、LAG が条件付きブロック内にある場合、false 条件では実行されず、キューを取得できないことを意味します。ブール値に関係なく true と false の両方の条件を評価する IFN 関数と IFC 関数を使用できますが、この場合はおそらく RETAIN の方が簡単です。

于 2013-05-07T14:24:21.400 に答える