1

私はSASを1年間オフとオンで使用してきましたが、ようやくアレイ、マクロ、その他すべての優れた機能に取り掛かっています。

私がやりたいこと:

テストでさまざまな学年の生徒からのデータとマージされたデータセットがあります。学年ごとに異なるファイルを作成する必要があります。データセットを簡単に並べ替えて別のファイルを作成するためのグレード変数がありません。各学年に固有の変数のインデックスがあります。

例-私が持っているもの:

+-------+--------+--------+--------+--------+--------+
|  ID   | sc_132 | sc_139 | sc_142 | sc_143 | sc_151 |
+-------+--------+--------+--------+--------+--------+
| 16623 | 1      | 1      | 0      | .      | .      |
| 16624 | 1      | 0      | 0      | .      | .      |
| 16626 | 1      | 1      | 1      | .      | .      |
| 17221 | .      | .      | .      | 1      | 0      |
| 17222 | .      | .      | .      | 0      | 1      |
| 17225 | .      | .      | .      | 0      | .      |
+-------+--------+--------+--------+--------+--------+

例-私が欲しいもの:

+-------+--------+--------+--------+--------+--------+
|  ID   | sc_132 | sc_139 | sc_142 | sc_143 | sc_151 |
+-------+--------+--------+--------+--------+--------+
| 16623 | 1      | 1      | 0      | .      | .      |
| 16624 | 1      | 0      | 0      | .      | .      |
| 16626 | 1      | 1      | 1      | .      | .      |
+-------+--------+--------+--------+--------+--------+
+-------+--------+--------+--------+--------+--------+
|  ID   | sc_132 | sc_139 | sc_142 | sc_143 | sc_151 |
+-------+--------+--------+--------+--------+--------+
| 17221 | .      | .      | .      | 1      | 0      |
| 17222 | .      | .      | .      | 0      | 1      |
| 17225 | .      | .      | .      | 0      | .      |
+-------+--------+--------+--------+--------+--------+

わたしはどこにいますか:

各グレードに固有の変数がたくさんあり、一部の変数には欠測データが含まれているため、徹底的にグレード固有の変数をすべてチェックし、これらのフィールドのいずれかにデータを含む観測値を出力する必要があります。恐ろしく長いIFTHENステートメントを使用できます...

DATA grade1 grade2 grade3 grade4;
SET gradeall;
    IF sc_132 ^= . OR sc_139 ^= . OR (AND SO ON FOR ABOUT 34 VARIABLES) THEN OUTPUT grade1;
RUN;

しかし、これは配列を使用するのに良い時期だと思いました。doloopをいつどこで使用できるかについての簡単に解析できるドキュメントが見つかりません。他のプログラミング言語のロジックと、私が閲覧したdoループを使用して、次のようにまとめました。

%let gr1_var = sc_132 sc_139 sc_142;
/*-GRADE SPECIFIC ARRAY REPEATED FOR OTHER GRADES -*/

DATA grade1 grade2 grade3 grade4;
SET gradeall;
PUT &gr1_var;
ARRAY grade1 [*] &gr1_var;
IF (
    DO i= 1 TO (DIM(items5_all)-1);
        items5_all(i) ^=. OR ;
    END;
    DO i= DIM(items5_all);
        items5_all(i) ^=.;
    END;
    )
THEN OUTPUT grade1;
    /*-IF THEN STATEMENT THEN REPEATED FOR OTHER GRADES-*/
run;

これにより、入力しなくても上記の長いIFTHENステートメントと同等のものが得られることを期待していました。しかしもちろん、それは機能していません。

Ifステートメント内でdoループを使用することもできますか(この例は見つかりませんでした)?
このタスクを実行する方法について誰かが推奨事項を持っていますか?

4

1 に答える 1

2

sum特定のフィールドのデータを含む観測値のみを出力したい場合は、配列を実行するだけでよいと思います。いずれかの観測値に変数の値がない場合、合計は空であるため、この観測値は出力されません。ループは必要ありません。と同じように:

 %let gr1_var = sc_132--sc_142; /*for array definition, you may use "--" or "-" */
 %let gr2_var = sc_143 sc_151;

 DATA grade1 grade2;
 SET gradeall;
 ARRAY grade1 [*] &gr1_var;
 ARRAY grade2 [*] &gr2_var;
 if sum(of grade1(*))^=. then output grade1;
 if sum(of grade2(*))^=. then output grade2;
 run;

ちなみに、ここでマクロを使用すれば、複数if..thenの配列定義を書く必要はありません。

DOそして、ここに置いたようなLOOPinsideif..elseステートメントを使用できるとは思いません。

于 2012-11-30T20:58:07.237 に答える