SAS通过命令导致缺少观察

时间:2018-05-10 19:26:37

标签: sas

我自己学习SAS,但是在命令方面遇到了问题。

样本数据:

enter image description here

原始代码很好:

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;

输出如下:

enter image description here

奇怪的是观察到的是17和19。你能告诉我为什么以及如何解决这个问题?谢谢。

2 个答案:

答案 0 :(得分:0)

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

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-group processing时,您必须使用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程序通常不会按组自动排序。它们必须在使用前进行分类或索引。

答案 1 :(得分:0)

只需在notsorted声明中添加by关键字即可;这将处理未排序的数据,而不必在proc sort语句之前。

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