SAS程序中ID前@1列指针引发的数据读取异常问题咨询
SAS程序中@1列指针的问题解析
问题场景
这段代码原本意图是:用首行数据作为标准答案KEY,后续两行作为考生的ID和答题数据,计算得分。但给ID的INPUT语句加上@1后,出现了错误读取首行作为考生数据的问题,而@5列指针却能正常工作。
为什么@1会导致错误
- 行指针的状态保留:当
_N_=1时,DO循环里的INPUT KEY[I] @;用了@(行保持符),读完10个标准答案后,行指针停在首行的末尾,不会自动跳到下一行。 - @1强制拉回列指针到当前行开头:紧接着执行的
INPUT @1 ID $ ...中,@1是列指针控制符,它会强制把当前行的列指针拉回到第1列——而此时当前行还是首行(因为之前的@没换行),所以程序会把首行的第一个字符A当成考生ID,从第5列开始读取的也是首行的内容,错误地生成了一条基于首行的观测。 - 后续迭代的连锁问题:第一次迭代结束后,行指针才跳到下一行(因为这个INPUT语句没有行保持符),但此时已经多生成了一条错误的首行观测,而原本首行应该只用来加载
KEY,不生成观测。
为什么@5能正常工作
@5同样是列指针控制符,但它的作用只是在当前行内移动到第5列,不会改变行指针所在的行:
- 当没有加
@1时,在_N_=1的DO循环读完首行后,行指针停在首行末尾,执行INPUT ID $时,SAS发现当前行已经没有剩余数据,会自动跳到下一行(考生数据行)读取ID,之后@5只是定位到该行的第5列读取答题数据,完全符合预期。 - 即使在加了
@1的错误场景里,@5本身的功能也没问题——它确实会在当前行的第5列开始读取,只是当前行被@1强制改成了首行,才导致数据错误。
内容的提问来源于stack exchange,提问作者Life is BS
相关产品推荐
相关产品推荐

