2017-07-19 39 views
0

我在SAS有一個表,我試圖找到給定列的最大值和第二個最大值。如何找到列的兩個最大值

例如:

Id Column 
1 100 
2 50000 
3 50 
4 4000 
5 97 
6 7000 

我的代碼需要找到這樣的:

Id Column 
2 50000 
6 7000 

有沒有辦法做到這一點在proc sql(甚至在SAS語言)?

+0

如果有領帶怎麼辦? – Strawberry

回答

1

假設沒有關係,按降序對錶進行排序,然後取前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; 
0

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的觀察。這與幾乎任何其他解決方案的關係都一樣。

0

另一種選擇: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; 
0

爲了完整起見,這裏有一個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; 
0

這裏有一個不同的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; 
相關問題