SAS:proc Summary和proc Sort

gau*_*inc 0 sorting sas proc

如果你将proc摘要与class-clause一起使用,它将按照这个类的顺序对你的观察结果进行排序.

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

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;
Run Code Online (Sandbox Code Playgroud)

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

Lon*_*ish 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_asks返回数据集中的所有变量,这会在日志中为先前在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;
Run Code Online (Sandbox Code Playgroud)