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

SAS determine first and last non-missing ID / date by class for each variable

我想要按城市列出 longitudinal/panel 数据集中所有变量的报告。 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;

我想要的输出是 table,看起来像这样:

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 TRANSPOSEPROC SQL 中的 create table 是执行此操作的最佳方法,但我愿意接受建议 - 我不确定在哪里开始。

谢谢!

我肯定会在这里采用 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;