SAS:proc Summary和proc Sort

时间:2012-07-18 09:51:18

标签: sorting sas proc

如果您将proc摘要与class-clause一起使用,它将按照 class -clause的顺序对您的观察进行排序。

proc summary data=One;
   by var_1;
   class var_2 var_3 var_4;
   output out = Two(drop= _freq_ _type_);
run;

1)我是对的吗?

2)如果我没有指定所有字段会发生什么?

proc summary data = Three(keep= var_1 var_2 var_ 3 var_4 var_5 var_6);
   by var_1;
   class var_2 var_3;
   output out = Four(drop= _freq_ _type_ );
run;

3)哪个处理速度更快:proc summaryproc sort

1 个答案:

答案 0 :(得分:5)

这里有几点需要注意。

  • 为了保留相同数量的行,您需要在proc summary语句中指定nway选项。没有它,你将获得每个1,2和3组类变量。
  • 我不确定为什么你有BY语句(这显然表明数据已经被该变量排序)。您可以在CLASS语句中轻松包含var_1。
  • Proc Summary将首先按BY变量的顺序对输出进行排序,然后按照指定的顺序对CLASS变量进行排序。
  • 无论保留哪个变量,此逻辑都适用。
  • Proc Sort应该在这个简单的实例中运行得更快,因为Proc Summary将执行不需要的进一步计算。
  • 我有时会使用Proc Summary在一个步骤中对数据进行排序和重复数据删除(使用maxid函数),例如:我每天有多个ID,我只想拿最新的ID。这样就不必对数据进行排序,然后每个ID每天提取最后一条记录。

希望这有帮助。

这是我最后一点的一个例子。使用_all_要求返回数据集中的所有变量,这会在日志中为先前在CLASS语句中列出的变量创建警告,但可以安全地忽略它。基本上我懒得不想为宽数据集分别指定剩余的变量。

data have;
input unique_id custno log_dt :datetime15.;
format log_dt datetime15.;
cards;
1 123 01jul2012:13:23
2 265 01jul2012:13:56
3 342 01jul2012:15:02
4 123 01jul2012:17:12
5 342 01jul2012:18:33
6 265 02jul2012:08:41
7 123 02jul2012:10:14
8 265 02jul2012:11:05
;
run;

proc summary data=have nway;
class custno log_dt;
format log_dt dtdate9.;
output out=want (drop=_:) maxid(log_dt(_all_))=;
run;