2014-08-29 274 views
1

每个ID有几个实例,每个实例都有不同的值。我希望最终的输出是每个ID的最大值。因此,最初的数据集:SAS通过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两次排序以为第一个排序将得到的东西以正确的顺序,以便在第二的是nodupkey排序会摆脱正确的价值观。这没有奏效。

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

谢谢!

回答

2

你的方法应该可以正常工作,但它看起来像你有一个语法错误 - 你忘了检查你的日志?降序关键字需要在要按降序排序的变量之前进行。

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; 
+0

他也放弃了'data ='。 – Joe 2014-08-29 17:38:02

+0

@Joe - 哈我没注意到。我想你一定是早日开始了长周末,因为有几个没有答案的问题。 = P – 2014-08-29 17:57:54

2

我首选的方案:

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

应该是很多快于两类。

+0

对于相当小的数据集,这是很好的,但是如果您拥有数百万个不同的ID,则可能会遇到内存问题。 – user667489 2014-08-30 19:19:55

+0

PROC MEANS将在大部分工作中使用磁盘空间;它会遇到计算非常大的数据集的分位数(如中位数)的问题,但我从来没有遇到PROC MEANS计算简单统计数据的内存问题,比如MAX,并且我已经在具有数百万个ID的数据集上多次使用它。 – Joe 2014-08-30 20:29:40