SAS被命令导致观察缺失

SAS被命令导致观察缺失,sas,Sas,我自己在学习SAS,但在指挥方面遇到了问题 样本数据: 原始代码很好: proc print data = sashelp.class; var name sex age height weight; where age > 14; sum weight; run; 但当我添加一个by命令时: proc print data = sashelp.class; var name sex age height weight; where age &g

我自己在学习SAS,但在指挥方面遇到了问题

样本数据:

原始代码很好:

proc print data = sashelp.class;
    var name sex age height weight;
    where age > 14;
    sum weight;
run;
但当我添加一个by命令时:

proc print data = sashelp.class;
    var name sex age height weight;
    where age > 14;
    sum weight;
    by age;
run;
产出如下所示:


奇怪的是,第17条和第19条的观察结果都不见了。你能告诉我为什么以及如何解决这个问题吗?谢谢。

如果查看日志,您会发现错误:

ERROR: Data set SASHELP.CLASS is not sorted in ascending sequence. The current BY group has Age = 16 and the next BY group has Age = 15.
使用时,必须按变量
by
对数据进行排序或索引

在处理数据时,SAS希望数据已按顺序排列,或具有保存顺序的索引

前三个观测值的顺序是正确的,从15上升到16。一旦到达第4个观察值,它会看到“按组”值为15。然后它将出错,停止处理,如果是
PROC PRINT
,则打印出错前获得的结果。您可以通过排序
sashelp.class
来解决此问题:

proc sort data=sashelp.class
          out=class;
    by age;
run;

proc print data = class;
    var name sex age height weight;
    where age > 14;
    sum weight;
    by age;
run;

SAS程序通常不会按组自动排序。它们在使用之前必须进行排序或索引。

只需在
by
语句中添加
notsorted
关键字;这将处理未排序的数据,而不必在前面加上
proc sort
语句

proc print data = sashelp.class ;
    var name sex age height weight;
    where age > 14;
    sum weight;
    by age notsorted;
run;

notsorted
BY选项不会对数据进行排序。NOTSORTED根据具有相同by值组合的传入连续行创建组。where子句删除<15行,因此未排序的组是Age=15(两行)、Age=16(一行)和Age=15(两行)。谢谢您的帮助,明白了。明白了,非常感谢您的帮助和解释。