我在SAS有一個表,我試圖找到給定列的最大值和第二個最大值。如何找到列的兩個最大值
例如:
Id Column
1 100
2 50000
3 50
4 4000
5 97
6 7000
我的代碼需要找到這樣的:
Id Column
2 50000
6 7000
有沒有辦法做到這一點在proc sql
(甚至在SAS語言)?
我在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;
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
會爲你做這一點,因爲在the documentation for the proc解釋:
proc univariate data=sashelp.class;
var height;
id name;
run;
看看Extreme Observations
表。
如果你想在一個數據集,你只需要使用extremeobs
輸出對象:
ods output extremeobs=extremes;
proc univariate data=sashelp.class;
var height;
id name;
run;
ods output close;
然後篩選到high
變量,第4和第5的觀察。這與幾乎任何其他解決方案的關係都一樣。
另一種選擇:PROC MEANS
使用IDGROUP
。這會爲您提供一個水平/寬度的數據集,但您可以使用PROC TRANSPOSE
或數據步驟對其進行轉置。有關更多詳細信息,請參閱紙張Transposing Data Using PROC SUMMARY'S IDGROUP Option。
proc means data=sashelp.class;
var height;
output out=classout idgroup(max(height) out[2] (height name)=height name) /autoname;
run;
爲了完整起見,這裏有一個proc sql
解決方案。不一定比其他人更好,也不會處理關係。
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;
這裏有一個不同的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;
如果有領帶怎麼辦? – Strawberry