私は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ループを使用することもできますか(この例は見つかりませんでした)?
このタスクを実行する方法について誰かが推奨事項を持っていますか?