我有一些SAS代码:
DATA MY_SAMPLE;
SET SAMPLE;
BY A;
IF A = 1 THEN B = 1;
ELSE IF A ^= 1 THEN B = 0;
ELSE IF MISSING(A) THEN B = .;
IF FIRST.A;
RUN;
返回一个带有0个观察值的集合(它不应该这样做)。我已经按A对数据进行了排序,并尝试在应用IF FIRST.A之前将数据读入中间数据集,但得到相同的结果。
我错过了一些完全明显的东西吗?我一直使用FIRST和LAST!
答案 0 :(得分:2)
同意@Robert,示例代码应该输出记录,假设输入数据中有记录并且已经排序。
我会从您的真实程序/数据中仔细检查日志,并确保没有错误,并且输入数据集有记录。
如果这没有帮助,我会添加一些调试PUT语句,如下所示(未经测试):
DATA MY_SAMPLE;
SET SAMPLE;
BY A;
IF A = 1 THEN B = 1;
ELSE IF A ^= 1 THEN B = 0;
ELSE IF MISSING(A) THEN B = .; *This will never be true ;
put "Before subsetting if " (_n_ A first.A)(=) ;
IF FIRST.A;
put "After subsetting if " (_n_ A first.A)(=) ;
RUN;
正如罗伯特所指出的那样,写下你的Else if Missing(A)
永远不会成真,因为如果A缺失,先前的Else if A ^= 1
将评估为真,因为SAS使用二进制逻辑(真/假),而不是三元逻辑(真/假/空)。
另外,我会检查代码中的任何流浪OUTPUT
语句。
答案 1 :(得分:0)
检查日志;检查输入;关闭MSSQL;再次打开它,看哪,代码第一次工作。感谢降级,但我没有意识到MSSQL容易出现抽搐!