0

如果您将 proc summary 与类子句一起使用,它将按照此类子句的顺序对您的观察结果进行排序

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

4

1 回答 1

5

这里有几点需要注意。

  • 为了保留相同数量的行,您需要在 proc 汇总语句中指定 nway 选项。没有它,您将获得类变量的每 1、2 和 3 个组合。
  • 我不确定你为什么有 BY 语句(这显然表明数据已经按该变量排序)。您可以轻松地将 var_1 包含在 CLASS 语句中。
  • Proc Summary 将首先按照 BY 变量的顺序对输出进行排序,然后按照指定的顺序对 CLASS 变量进行排序。
  • 无论保留哪些变量,此逻辑都适用。
  • Proc Sort 在这个简单的例子中应该工作得更快,因为 Proc Summary 将执行不需要的进一步计算。
  • 我有时会使用 Proc Summary 一步来对数据进行排序和重复数据删除(使用 maxid 函数),例如,我每天有多个 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;
于 2012-07-18T11:06:47.200 回答