如何使用SAS中的PROC MEANS在列中找到第二大数字?

时间:2016-01-18 13:04:02

标签: sas

我一直在研究SAS。我创建了一个虚拟数据集,如下所示:

data try1;
infile datalines;
length Level $ 10;
input Variable $ Level $ Exposure;
datalines;
A A1 100
A A2 200
A A3 300
A Unknown 1000
B B1 70
B B2 20
B B3 30
B B4 40
B Unknown 100
C C1 200
C C2 100
C C3 80
C Unknown 50
;
Run;

成功完成创建数据集后,我试图找出每个“变量”类中的最大数字,这是由PROC MEANS程序完成的。相同的代码如下:

proc means data=try1 noprint;
Class Variable;
id Level;
var Exposure;
output out = try2 (drop = Level _TYPE_ _FREQ_)
maxid(Exposure(Level)) = max_factor 
max=;
run;

我能够通过相同的方式获得正确的输出。但现在我想知道每个“变量”类中的第二大数字,当然我需要这样的输出:

Max_Exposure    Sec_Max_Exposure    Output
  Unknown            A3               A3
  Unknown            B1               B1
     C1              C2               C1

基本上我需要消除未知'等级',以便我可以获得所需的输出列。

任何人都可以使用PROC MEANS语句帮助我解决问题。

此致

2 个答案:

答案 0 :(得分:1)

我认为这是您想要的,但它与您显示的OUTPUT NEEDED不匹配。你的隐秘剥削并没有帮助。

这对EXPOSURE值没有任何特殊处理。

data try1;
infile datalines;
length Level $ 10;
input Variable $ Level $ Exposure;
datalines;
A A1 100
A A2 200
A A3 300
A Unknown 1000
B B1 70
B B2 20
B B3 30
B B4 40
B Unknown 100
C C1 200
C C2 100
C C3 80
C Unknown 50
;
Run;
proc print;
   run;
proc summary data=try1 nway;
   where level ne: 'Unk';
   class variable;
   output out=max2(drop=_type_)
      idgroup(max(exposure) out[2](exposure level)=);
   run;
proc print;
   run;

enter image description here

答案 1 :(得分:0)

你可以在一个datastep中完成......

data want ;
  set have ;
  by Variable ;

  length maxid1 maxid2 $10. 
  retain max1 max2 . maxid1 maxid2 '' ;

  if first.Variable then call missing(of max:) ;

  if Exposure > max1 then do ;
    max2 = max1 ;
    maxid2 = maxid1 ;
    max1 = Exposure ;
    maxid1 = Level ;
  end ;

  if last.Variable then output ;
run ;