我刚开始在SAS中使用宏和数组,并且是SAS的初学者用户。我需要你的指导和建议,以最有效的方式增加小于65的分数值。我有一个关于他们的学生ID和他们的考试成绩的10个观察数据集。我有以下代码来增加小于65的测试分数值。是否有另一种方法可以将小于65的测试分数值增加到65以上,以便在值为65或更大时停止。
data scores;
set scores;
array Test{i} Test_1-Test_5;
Test{i} = 1;
do i=1 to 5;
do until(Test{i}>65);
Test{i} = Test{i}+0.1;
end;
我收到此代码的错误:
Mixing of implicit and explicit array subscripting not allowed
There was 1 unclosed DO unblock
如果此代码有任何问题,请告诉我。 谢谢你的时间。
答案 0 :(得分:1)
让我们来看看你的代码
data scores;
set scores;
array Test{i} Test_1-Test_5;
Test{i} = 1;
do i=1 to 5;
do until(Test{i}>65);
Test{i} = Test{i}+0.1;
end;
??
??
什么是不正确的:
end
的循环和结束run
array
声明
array test{i}
不正确array test test1-test5;
推荐。array test(5);
隐式数组下标是旧版SAS中的一个未记录的工件,它允许遗留代码继续运行。
涉及变量
的传统形式的数组声明
array Test{i} Test_1-Test_5;
应该避免。此表单告诉SAS,当按名称引用数组test
时,只能在变量i
中找到要使用的数组索引。不允许使用test(<index>)
作为显式引用。
答案 1 :(得分:1)
使用以下代码更正了一些问题:
您声明的数组使用变量i
作为维度。在i
外循环之前,do
未分配值。请改用通配符*
。这将告诉SAS根据数组中指定的变量数自动生成维度。
Test[i]
被赋予一个值,但尚未分配i
。将test[i]
放在外do
循环
您错过了外end
循环的do
语句。
代码:
data test;
array Test[*] Test_1-Test_5;
do i=1 to 5;
Test[i] = 1;
do until(Test[i]>65);
Test[i] = Test[i]+0.1;
end;
end;
run;