1

我断断续续地使用 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 循环吗(我还没有找到任何这样的例子)?
有人对如何完成这项任务有任何建议吗?

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和数组定义。

而且我认为你不能像你放在这里的那样使用DOLOOP inside语句。if..else

于 2012-11-30T20:58:07.237 回答