SAS通过ID保留最大值
每个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;
谢谢!
你的方法应该可以正常工作,但它看起来像你有一个语法错误 - 你忘了检查你的日志?降序关键字需要在要按降序排序的变量之前进行。
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;
我首选的方案:
proc means data=have noprint;
class id;
var value;
output out=want max(value)=;
run;
应该是很多快于两类。
对于相当小的数据集,这是很好的,但是如果您拥有数百万个不同的ID,则可能会遇到内存问题。 – user667489 2014-08-30 19:19:55
PROC MEANS将在大部分工作中使用磁盘空间;它会遇到计算非常大的数据集的分位数(如中位数)的问题,但我从来没有遇到PROC MEANS计算简单统计数据的内存问题,比如MAX,并且我已经在具有数百万个ID的数据集上多次使用它。 – Joe 2014-08-30 20:29:40
他也放弃了'data ='。 – Joe 2014-08-29 17:38:02
@Joe - 哈我没注意到。我想你一定是早日开始了长周末,因为有几个没有答案的问题。 = P – 2014-08-29 17:57:54