Sas 如何找到一列的两个最大值
我在SAS中有一个表,我试图找到给定列的最大值和第二个最大值 例如:Sas 如何找到一列的两个最大值,sas,proc-sql,Sas,Proc Sql,我在SAS中有一个表,我试图找到给定列的最大值和第二个最大值 例如: Id Column 1 100 2 50000 3 50 4 4000 5 97 6 7000 我的代码需要找到以下内容: Id Column 2 50000 6 7000 在proc-sql(甚至在SAS语言中)中有什么方法可以做到这一点吗?假设没有关系,按降序对表进行排序,然后取前2个值 proc sort data=have out=temp; by descending column; run
Id Column
1 100
2 50000
3 50
4 4000
5 97
6 7000
我的代码需要找到以下内容:
Id Column
2 50000
6 7000
在
proc-sql
(甚至在SAS语言中)中有什么方法可以做到这一点吗?假设没有关系,按降序对表进行排序,然后取前2个值
proc sort data=have out=temp;
by descending column;
run;
data want;
set temp(obs=2);
run;
如果您有关联并且只需要不同的值,请尝试PROC SORT上的nodupkey
选项:
proc sort data=have out=temp nodupkey;
by descending column;
run;
data want;
set temp(obs=2);
run;
PROC UNIVARIATE
将为您执行此操作,如中所述:
查看极端观测值表
如果要将其放入数据集中,只需使用extremeobs
输出对象:
ods output extremeobs=extremes;
proc univariate data=sashelp.class;
var height;
id name;
run;
ods output close;
然后过滤到高
变量以及第4次和第5次观察。这与几乎任何其他解决方案的关系都有同样的问题。另一个选项:PROC意味着使用IDGROUP
。这将获得一个水平/宽数据集,但您可以使用PROC transpose
或数据步骤以任何方式对其进行转置。有关更多详细信息,请参阅本文
proc means data=sashelp.class;
var height;
output out=classout idgroup(max(height) out[2] (height name)=height name) /autoname;
run;
为了完整起见,这里有一个procsql
解决方案。不一定比其他任何一个都好,也不能处理关系
data have;
input Id Column;
datalines;
1 100
2 50000
3 50
4 4000
5 97
6 7000
;
run;
proc sql outobs=2;
create table want as
select * from have
order by column desc;
quit;
最后,一个使用proc-rank
的解决方案,该解决方案确实包括领带
data have;
input Id Column;
datalines;
1 100
2 50000
3 50000
4 4000
5 97
6 7000
;
run;
proc rank data=have out=want_ties (where=(column_rank<=2)) descending ties=dense;
var column;
ranks column_rank;
run;
数据已经存在;
输入Id列;
数据线;
1 100
2 50000
3 50000
4 4000
5 97
6 7000
;
跑
proc-rank data=have out=want\ties(其中=(column\u-rank这里有一个不同的proc-sql
选项-这个选项选择两个最高的不同值,以及所有具有这些值的ID。它有点复杂,并且只起作用,因为SAS在处理摘要统计信息方面很好
proc sql;
select age, name
from sashelp.class
where age =
(select max(age) from sashelp.class)
or age =
(select max(age) from
(select case when age=max(age) then . else age end as age from sashelp.class)
)
;
quit;
如果有领带呢?
proc sql;
select age, name
from sashelp.class
where age =
(select max(age) from sashelp.class)
or age =
(select max(age) from
(select case when age=max(age) then . else age end as age from sashelp.class)
)
;
quit;