SAS为每个变量按类确定第一个和最后一个非缺失ID /日期

时间:2016-08-08 17:01:41

标签: sql sas proc summary

我希望报告城市纵向/面板数据集中的所有变量。 PROC MEANS对此非常有用,但是这不能处理包含列的情况,这些列说明了有问题的变量没有丢失的第一个和最后一个日期。

我的数据看起来像这样:

data have;
input date $ city $ var1 var2 var3;
      datalines;
2006Q1  NYC   .  0.1   4
2006Q2  NYC   .  0.48  6
2006Q3  NYC   .  0.55  7
2006Q4  NYC   5  0.33  2
2007Q1  NYC   8    .  10
2007Q3  NYC  12    .   15
2006Q1  BOS  11  0.6   .
2006Q2  BOS   6  0.81  .
2006Q3  BOS   1  0.66  9
2006Q4  BOS   2  0.5   1
2007Q1  BOS   4  0.61  8
2007Q3  BOS  19  0.4   1
;
run;

我想要的输出是一个看起来像这样的表:

City Variable  First Nonmiss  Last Nonmiss
 BOS    var1   2006Q1         2007Q3 
 BOS    var2   2006Q1         2007Q3 
 BOS    var3   2006Q3         2007Q3 
 NYC    var1   2006Q4         2007Q3 
 NYC    var2   2006Q1         2006Q4
 NYC    var3   2006Q1         2007Q3

也许在PROC TRANSPOSEcreate table PROC SQL是最好的方式,但我愿意接受建议 - 而且我不确定从哪里开始

谢谢!

2 个答案:

答案 0 :(得分:1)

我肯定会在这里做proc transpose方法;它非常直截了当。这利用了{/ 1}}和first.在实现last.子句后定义的事实。

where

答案 1 :(得分:0)

绝对可以通过PROC MEANS / SUMMARY获得此输出,但您需要转置数据,以便取消我的答案。

data have;
input date $ city $ var1 var2 var3;
      datalines;
2006Q1  NYC   .  0.1   4
2006Q2  NYC   .  0.48  6
2006Q3  NYC   .  0.55  7
2006Q4  NYC   5  0.33  2
2007Q1  NYC   8    .  10
2007Q3  NYC  12    .   15
2006Q1  BOS  11  0.6   .
2006Q2  BOS   6  0.81  .
2006Q3  BOS   1  0.66  9
2006Q4  BOS   2  0.5   1
2007Q1  BOS   4  0.61  8
2007Q3  BOS  19  0.4   1
;
run;
proc print;
   run;
data want;
   input City $ Variable $  First_Nonmiss $ Last_Nonmiss $;
   cards;
 BOS    var1   2006Q1         2007Q3 
 BOS    var2   2006Q1         2007Q3 
 BOS    var3   2006Q3         2007Q3 
 NYC    var1   2006Q4         2007Q3 
 NYC    var2   2006Q1         2006Q4
 NYC    var3   2006Q1         2007Q3
;;;;
proc print;
   run;
proc transpose data=have out=havet name=variable;
   by city date notsorted;
   var var:;
   run;
proc print;
   run;
proc summary data=havet nway missing;
   class city variable;
   where not missing(col1);
   output out=want2(drop=_:)
      idgroup(out(date)=first_nonmiss)
      idgroup(last out(date)=last_nonmiss)
      ;
   run;
proc print;
   run;
proc compare base=want compare=want2 listequalvars;
   run;