选择具有数据步骤

时间:2017-04-27 16:07:12

标签: sas

old

date
05DEC2016   a
28NOV2016   b
22DEC2016   c
23JAN2017   d
12JAN2017   e
09JAN2017   f
25DEC2016   g

我需要创建一个新表:

data new;
     set old;
     ****the right code***
run;

这样,new包含具有最新日期的行。 所以new是:

23JAN2017   d

我首先尝试找到最新日期:latest_date = max(date),然后使用简单的where=,但正如您所见 - 这不起作用

2 个答案:

答案 0 :(得分:4)

SQL是最简单的方法。数据步骤中的max函数不能跨行工作(因为数据步骤中没有函数);它会给你最多的列数。在数据步骤中,您还可以转置,使用哈希,或者只使用跨行保留已保存的值并进行比较;但是SQL非常简单,使用having

data have;
format date date9.;
input date :date9. code :$1.;
datalines;
05DEC2016   a
28NOV2016   b
22DEC2016   c
23JAN2017   d
12JAN2017   e
09JAN2017   f
25DEC2016   g
;;;;
run;

proc sql;
  select date, code
    from have
    having date=max(date);
quit;

要以最简单的方式在数据步骤中执行,但必须使用retain,这些内容如下:

data want;
  set have end=eof;
  retain  max_Date max_code;
  if date > max_date then do;
    max_date = date;
    max_code = code;
  end;
  if eof then output;
  format max_date date9.;
  rename 
    max_date=date 
    max_code=code
  ;
  keep max_date max_code;
run;

最后,真正最简单的方法就是使用idgroup option in proc means

proc means data=have;
  var date;
  output out=want 
         idgroup(max(date) /* asks for the row with the maximum date */
        out[1]             /* asks for the 1 maximum date - could get more */
        (date code)=       /* asks for these two variables to be output */
  );
run;

答案 1 :(得分:0)

另一种方法是对数据进行排序,使最大的数据最终位于数据的顶部,然后进行第一次观察。这种方法的好处 - 它非常容易理解和编码。缺点是对大型数据集进行排序会占用大量时间/内存。

data have;
format date date9.;
input date :date9. code :$1.;
datalines;
05DEC2016   a
28NOV2016   b
22DEC2016   c
23JAN2017   d
12JAN2017   e
09JAN2017   f
25DEC2016   g
;;;;
run;

proc sort data=have;
by descending date;
run;

data want;
set have (obs=1);
run;