将数值增加到恰好高于标准值,并使用do until循环停止增加到SAS中的值以下

时间:2018-04-24 09:39:33

标签: arrays loops sas do-loops

我刚开始在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

如果此代码有任何问题,请告诉我。 谢谢你的时间。

2 个答案:

答案 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;
  ??
??

什么是不正确的:

  • DATA步骤不完整。 ?? ??应该使用终止end的循环和结束run
  • 的步骤替换
  • array声明
    • 无法根据变量值将数组声明为动态大小,因此为 array test{i}不正确
    • 未指定大小的数组可以与显式SAS variable list相关联。数组的大小自动为列表中的变量数。例如:
      此问题array test test1-test5; 推荐
    • 指定大小的数组。这会自动创建或关联变量与数组,例如
      array test(5);

隐式数组下标是旧版SAS中的一个未记录的工件,它允许遗留代码继续运行。

涉及变量
的传统形式的数组声明 array Test{i} Test_1-Test_5;
应该避免。此表单告诉SAS,当按名称引用数组test时,只能在变量i中找到要使用的数组索引。不允许使用test(<index>)作为显式引用。

答案 1 :(得分:1)

使用以下代码更正了一些问题:

  1. 您声明的数组使用变量i作为维度。在i外循环之前,do未分配值。请改用通配符*。这将告诉SAS根据数组中指定的变量数自动生成维度。

  2. Test[i]被赋予一个值,但尚未分配i。将test[i]放在外do循环

  3. 您错过了外end循环的do语句。

  4. 代码:

    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;