SAS按类确定每个变量的第一个和最后一个未丢失的ID /日期



我想要一个城市纵向/面板数据集中所有变量的报告。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 tablePROC SQL是最好的方法,但我愿意接受建议——我真的不确定从哪里开始。

谢谢!

我肯定会在这里使用proc transpose方法;这很简单。这利用了first.last.是在实现where子句之后定义的这一事实。

proc sort data=have;
  by city date;
run;
proc transpose data=have out=have_t;
  by city date;
  var var1-var3;
run;
proc sort data=have_t;
  by city _name_ date;
run;
data want;
  set have_t;
  by city _name_ date;
  retain first_nonmiss;
  where not missing(col1);
  if first._name_ then do;
    first_nonmiss = date;
  end;
  if last._name_ then do;
    last_nonmiss = date;
    output;
    call missing(of first_nonmiss);  *I like to do this for safety even though it is irrelevant here - later code might make it relevant;
  end;
run;

使用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;

相关内容

  • 没有找到相关文章

最新更新