【问题标题】:SAS: proc Summary and proc SortSAS:proc总结和proc排序
【发布时间】:2012-07-18 09:51:17
【问题描述】:

如果您将 proc summary 与 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

【问题讨论】:

    标签: sorting sas proc


    【解决方案1】:

    这里有几点需要注意。

    • 为了保留相同数量的行,您需要在 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;
    

    【讨论】:

    • 你能补充一些例子吗?
    • 我同意以上 2 点。 1.为了保持相同的行数,需要在proc的汇总语句中指定nway选项。没有它,您将获得类变量的每 1、2 和 3 个组合。 2. 类变量将自动对提到的变量的数据进行排序。 3.如果需要计算,那么proc summary是最好的程序,因为它会节省之后的排序时间(如果数据很大)。
    猜你喜欢
    • 2016-05-20
    • 2019-02-05
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多