我断断续续地使用 SAS 一年了,我终于开始研究数组、宏和所有那些很酷的东西。
我想做的事:
我有一个合并的数据集,其中包含来自不同年级学生的测试数据。我需要为每个年级创建不同的文件。我没有等级变量来轻松对数据集进行排序并创建不同的文件。我确实有一个特定于每个年级的变量索引。
示例 - 我有什么:
+-------+--------+--------+--------+--------+--------+
| 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 | . |
+-------+--------+--------+--------+--------+--------+
我在哪里:
我有很多特定于每个年级的变量,其中一些变量包含缺失的数据,所以为了彻底,我应该检查所有年级特定的变量并输出包含任何这些字段中数据的任何观察结果。我可以使用一个非常长的 IF THEN 语句......
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;
但我认为这是使用数组的好时机。我找不到任何易于解析的关于何时何地可以使用 do 循环的文档。使用我对其他编程语言的逻辑以及我浏览过的有关 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;
我希望这会给我相当于上面的长 IF THEN 语句,而不必键入它。但当然它是非功能性的。
你甚至可以在 If 语句中使用 do 循环吗(我还没有找到任何这样的例子)?
有人对如何完成这项任务有任何建议吗?