我自己学习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。你能告诉我为什么以及如何解决这个问题?谢谢。
答案 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;