如何在SAS中按类和ID创建运行条件和变量

时间:2018-10-05 15:42:34

标签: sas

从累积的情节计数(如果时间间隔少于10天,则视为一个情节),我想根据ID按班级计算连续情节计数的“宽”和“长”版本。

这就是我现在的数据。

process.env.API_KEY

我通过以下代码实现了运行计数:

id  Class   Date      Obsvn Episode_Sum
9   Wide    3/10/2012   1   1
9   Wide    3/12/2012   2   1
9   Wide    7/1/2012    111 2
9   Wide    7/3/2012    2   2
108 Wide    3/31/2011   1   1
108 Long    3/31/2011   1   1
108 Wide    4/17/2011   17  2
108 Wide    6/24/2011   68  3
108 Wide    6/16/2012   358 4
108 Wide    7/20/2012   34  5
108 Wide    7/27/2012   7   5

我希望我的数据看起来像这样:

data want (drop=lag); set have;

by id date;

format lag mmddyy10.;
lag=lag(date);

if first.id then obsvn=1;
else obsvn=max(intck("Day", Lag, date),1);

if first.id then episode_sum=1;
else if obsvn>10 then episode_sum+1;

run;

但是我得到了:

id  Class   Date     Obsvn Sum Wide Long
9   Wide    3/10/2012   1   1   1   0
9   Wide    3/12/2012   2   1   1   0
9   Wide    7/1/2012    111 2   2   0
9   Wide    7/3/2012    2   2   2   0
108 Wide    3/31/2011   1   1   1   0
108 Long    3/31/2011   1   1   1   1
108 Wide    4/17/2011   17  2   2   1
108 Wide    6/24/2011   68  3   3   1
108 Wide    6/16/2012   358 4   4   1
108 Wide    7/20/2012   34  5   5   1
108 Wide    7/27/2012   7   5   5   1

这是我的代码,用于按时长条地创建情节。我试图解释每个ID切换类的时间。我该如何实现?

id  Class   Date    Obsvn  Sum Wide Long
9   Wide    3/10/2012   1   1   1   0
9   Wide    3/12/2012   2   1   1   0
9   Wide    7/1/2012    111 2   2   0
9   Wide    7/3/2012    2   2   **1**   0
108 Wide    3/31/2011   1   1   1   **1**
108 Long    3/31/2011   1   1   1   1
108 Wide    4/17/2011   17  2   2   1
108 Wide    6/24/2011   68  3   3   1
108 Wide    6/16/2012   358 4   4   1
108 Wide    7/20/2012   34  5   5   1
108 Wide    7/27/2012   7   5   **1**   1

1 个答案:

答案 0 :(得分:3)

棘手的是,您在第二个ID组中具有同一DATE的两条记录。因此,在计算天数变化时,您想跟踪它。

这是一种方法。首先,让我们输入您的源数据(和所需的结果)。

data have ;
  input id Class $ Date :mmddyy. EObsvn ESum EWide ELong ;
  format date yymmdd10.;
cards;
9   Wide    3/10/2012   1   1   1   0
9   Wide    3/12/2012   2   1   1   0
9   Wide    7/1/2012    111 2   2   0
9   Wide    7/3/2012    2   2   2   0
108 Wide    3/31/2011   1   1   1   0
108 Long    3/31/2011   1   1   1   1
108 Wide    4/17/2011   17  2   2   1
108 Wide    6/24/2011   68  3   3   1
108 Wide    6/16/2012   358 4   4   1
108 Wide    7/20/2012   34  5   5   1
108 Wide    7/27/2012   7   5   5   1
;

您可能想查找首先存在WIDE或LONG间隔的日期。

data long ;
  set have ;
  by id date;
  where class='Long';
  if first.date;
  lag=lag(date);

  if first.id then call missing(lag,obsvn);
  else obsvn=max(intck("Day", Lag, date),1);
  lflag = missing(lag) or obsvn > 10 ;
  keep id date lflag ;

run;


data wide ;
  set have ;
  by id date;
  where class='Wide';
  if first.date;
  lag=lag(date);

  if first.id then call missing(lag,obsvn);
  else obsvn=max(intck("Day", Lag, date),1);
  wflag = missing(lag) or obsvn > 10 ;
  keep id date wflag ;

run;

然后按日期将其合并回源并计算您的计数器。

data want ;
  merge have wide long ;
  by id date;

  if first.date then do ;
    lag=lag(date);
    format lag yymmdd10.;
    if first.id then call missing(lag,obsvn);
    else obsvn=max(intck("Day", Lag, date),1);
    retain lag obsvn;
  end;

  if first.id then call missing(sum,wide,long);
  if missing(lag) or obsvn > 10 then sum+first.date ;
  wide + (wflag and first.date);
  long + (lflag and first.date);

run;  

enter image description here