【问题标题】:SAS Keep maximum value by IDSAS 按 ID 保持最大值
【发布时间】:2014-08-29 16:38:27
【问题描述】:

每个 ID 都有多个实例,每个实例都有不同的值。我希望最终输出是每个 ID 的最大值。所以初始数据集是:

 ID     Value
 1      100
 1      7
 1      65
 2      12
 2      97
 3      82
 3      54

输出将是:

 ID     Value
 1      100
 2      97
 3      82

我尝试运行 proc sort 两次,认为第一次排序会以正确的顺序排列,这样第二次排序的 nodupkey 就会去掉正确的值。这不起作用。

 proc sort work.data; by id value descending; run;
 proc sort work.data nodupkey; by id; run;    

谢谢!

【问题讨论】:

    标签: sas


    【解决方案1】:

    您的方法应该可以正常工作,但您似乎有语法错误 - 您是否忘记检查您的日志?降序关键字需要放在要降序排序的变量之前。

    proc sort data=sashelp.class out=tmp;
      by sex descending height;
    run;
    
    proc sort data=tmp out=final nodupkey;
      by sex;
    run;
    

    另外,如果您不熟悉 SQL,我强烈建议您学习它,因为它可以简化许多数据操作任务。这也可以在一个 SQL 步骤中解决:

    proc sql noprint;
      create table want as
      select sex,
             max(height) as height
      from sashelp.class
      group by sex
      ;
    quit;
    

    【讨论】:

    • 他也离开了data=
    • @Joe - 哈,我没注意到。我想你一定很早就开始了长周末,因为有几个未回答的问题。 =P
    【解决方案2】:

    我的首选解决方案:

    proc means data=have noprint;
      class id;
      var value;
      output out=want max(value)=;
    run;
    

    应该比两种快很多。

    【讨论】:

    • 这对于相当小的数据集来说很好,但如果您有数百万个不同的 ID,您可能会遇到这种方法的内存问题。
    • PROC MEANS 将使用磁盘空间来完成大部分工作;它会在计算非常大的数据集的分位数(如中位数)时遇到问题,但我从来没有遇到过使用 PROC MEANS 计算简单统计数据(如 MAX)的内存问题,而且我已经多次在具有数百万个 ID 的数据集上使用它.
    • 如果您在另一个答案的第一种类型的 by 中有两个以上的变量,这种方法可以工作吗?
    • 当然,class 语句会处理这个问题(并且需要 TYPES 语句来获取所需的信息,或者可能是 WAYS)。
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多