【问题标题】:SAS determine first and last non-missing ID / date by class for each variableSAS 为每个变量按类确定第一个和最后一个非缺失 ID/日期
【发布时间】:2016-08-08 17:01:41
【问题描述】:

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

谢谢!

【问题讨论】:

  • 这在PROC MEANS 中绝对是不可能的(这不是PROC MEANS 提供的统计数据之一)。您应该重新构造这个问题以询问如何通常计算这个(很可能),或者,如果这是计算出来的,如何以类似于PROC MEANS 输出的方式报告这个(也很有可能)。这两件事有很大的不同,不过,我不认为它们是一个问题。
  • 该死。感谢您确认@Joe。我已经相应地重新构建了问题。

标签: sql sas proc summary


【解决方案1】:

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

【讨论】:

  • 这太棒了。谢谢!我只是想确保我了解最后data 步骤中发生了什么。因此,where not missing(col1) 通过col1 对数据进行子集化,if first.if last. 仅返回相应的行,这对于每个组都是正确的(?)。而且,by city _name_ date 命令会自动创建这些 city/_name_ 组?另外,为什么有retain first_nonmissing 而不是last_nonmiss。 (call missing() 仍然超出我的理解范围,但总是乐于学习最佳实践!)
【解决方案2】:

绝对有可能使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多