SAS首先和最后一个障碍,时间崩溃

时间:2016-10-21 19:42:38

标签: sas proc-sql do-loops

我陷入了一项任务。

现在我有一个名为placement的变量,它有两个类别,在家外和在家(简称A和B)。 案例可以顺序放在AAABAB。 例如,每个展示位置都有一个开始日期和结束日期 01/20 / 2015-2 / 21/2015第一个A, 2/21 / 2015-8 / 05/2015第二次A ......等等。

现在我构建了这样的数据,111.1。 (A为1,B为缺失)。 如何结合户外放置时间? 也就是说,使用第一个A的开始日期作为开始日期,使用第三个A的结束日期作为结束日期。这将是该案件不在家的第一段时间。 我正在考虑使用do循环来执行此操作。但无法弄清楚如何。

我认为,另一种方法是识别户外群体, 例如,AAABAABAAAA可以标记为11123345555。 然后我可以使用PROC SQL,min和max函数来查找开始日期和结束日期。

proc sql; 创建表梳子 选择*,min(strtdt)为minstrtdt,max(livarenddt)为maxenddt from limt groupid by caseid,groupid; 退出;

原始数据,如此,(out表示不在家,1表示是,。表示否)

Obs caseid livarstrtdt livarenddt placemnt out

   81    00040903     14SEP2010     09DEC2010     01                   .
   82    00040903     09DEC2010     28FEB2011     02                   1
   83    00040903     28FEB2011     01APR2011     02                   1
   84    00040903     01APR2011     01JUL2011     02                   1
   85    00040903     01JUL2011     08AUG2012     02                   1
   86    00040903     08AUG2012     05NOV2014     02                   1
   87    00040903     05NOV2014     05NOV2014     03                   .
   88    00040903     12AUG2008     13AUG2008     12                   1
   89    00040903     13AUG2008     13AUG2008     01                   .
   90    00040903     13AUG2008     21AUG2008     01                   .

我希望输出像这样,

Obs caseid livarstrtdt livarenddt placemnt out

   81    00040903     14SEP2010     09DEC2010     01                   .
   82    00040903     09DEC2010     05NOV2014     02                   1

   87    00040903     05NOV2014     05NOV2014     03                   .
   88    00040903     12AUG2008     13AUG2008     12                   1
   89    00040903     13AUG2008     13AUG2008     01                   .
   90    00040903     13AUG2008     21AUG2008     01                   .

有人有想法吗? 谢谢!

UPDATE,

现在我修改了数据,           caseid livaropnseq livarstrtdt livarenddt placemnt out

183  00040903      01        14SEP2010   09DEC2010   01                 .
184  00040903      01        09DEC2010   28FEB2011   02                 1
185  00040903      01        28FEB2011   01APR2011   02                 1
186  00040903      01        01APR2011   01JUL2011   02                 1
187  00040903      01        01JUL2011   08AUG2012   02                 1
188  00040903      01        08AUG2012   05NOV2014   02                 1
189  00040903      01        05NOV2014   05NOV2014   03                 .
190  00040903      02        12AUG2008   13AUG2008   12                 .
191  00040903      02        13AUG2008   13AUG2008   02                 1
192  00040903      02        13AUG2008   21AUG2008   02                 1

如您所见,不应将不同livaropnseq的行组合在一起。 例如,行189和190,即使案例在两个时间段都在家,它们属于不同的livaropnseq(不同的开放序列)。如何将此变量合并到代码中以避免将它们折叠在一起?非常感谢!!!

输出应该是这样的,     cases livaropnseq livarstrtdt livarenddt placemnt outs

183  00040903      01        14SEP2010   09DEC2010   01                 .
184  00040903      01        09DEC2010   05NOV2014   02                 1
189  00040903      01        05NOV2014   05NOV2014   03                 .
190  00040903      02        12AUG2008   13AUG2008   12                 .
191  00040903      02        13AUG2008   21AUG2008   02                 1

再次更新, 我使用以下代码来获得我最想要的东西!

data spell6;
set spell4;
by caseid livaropnseq out notsorted ;
group + first.out;
if first.caseid then group=1;
if first.out then startdt=livarstrtdt ;
retain startdt;
if last.out;
enddt = livarenddt ;
format startdt enddt date9.;
*drop livarstrtdt livarenddt ;
run;

非常感谢你,每个人!我真的很感激!

3 个答案:

答案 0 :(得分:0)

您可以在RETAIN和OUTPUT的帮助下在DATA步骤中执行此操作:

DATA dset2 (KEEP=caseid new_start new_stop new_out);
  SET dset1;
  BY caseid;
  RETAIN new_start new_stop new_out current_pl;
  IF first.caseid THEN DO;
    new_start=livarstrtdt;
    new_stop=livarenddt;
    new_out=out;
    current_pl=placemnt;
  END;
  ELSE IF placemnt=current_pl THEN new_stop=livarenddt;
  ELSE DO;
    OUTPUT;
    new_start=livarstrtdt;
    new_stop=livarenddt;
    new_out=out;
    current_pl=placemnt;
  END;
  IF last.caseid THEN OUTPUT;
RUN;

如果我误解,请告诉我。我的输出不包括obs 89,看起来它不应该在输出中。

编辑:我更新了代码以保持" out"变量。以下是我的输出:

caseid   new_start new_stop  new_out 
00040903 14SEP2010 09DEC2010 . 
00040903 09DEC2010 05NOV2014 1 
00040903 05NOV2014 05NOV2014 . 
00040903 12AUG2008 13AUG2008 1 
00040903 13AUG2008 21AUG2008 .

如果这不是你想要的,请更清楚。

答案 1 :(得分:0)

您可以在DATA步骤的NOTSORTED语句中使用BY选项让SAS知道何时更改位置。您没有说明如何处理额外变量PLACEMNT,因此此代码将保留它在组中最后一次观察时所具有的值。

data have;
  input caseid $ livarstrtdt livarenddt placemnt $ out ;
  informat livarstrtdt livarenddt date9. ;
  format livarstrtdt livarenddt date9. ;
cards;
00040903 14SEP2010 09DEC2010 01 .
00040903 09DEC2010 28FEB2011 02 1
00040903 28FEB2011 01APR2011 02 1
00040903 01APR2011 01JUL2011 02 1
00040903 01JUL2011 08AUG2012 02 1
00040903 08AUG2012 05NOV2014 02 1
00040903 05NOV2014 05NOV2014 03 .
00040903 12AUG2008 13AUG2008 12 1
00040903 13AUG2008 13AUG2008 01 .
00040903 13AUG2008 21AUG2008 01 .
;;;;

data want ;
  set have ;
  by caseid out notsorted ;
  group + first.out;
  if first.caseid then group=1;
  if first.out then startdt=livarstrtdt ;
  retain startdt;
  if last.out;
  enddt = livarenddt ;
  format startdt enddt date9.;
  drop livarstrtdt livarenddt ;
run;

结果

Obs     caseid     placemnt    out    group      startdt        enddt
 1     00040903       01        .       1      14SEP2010    09DEC2010
 2     00040903       02        1       2      09DEC2010    05NOV2014
 3     00040903       03        .       3      05NOV2014    05NOV2014
 4     00040903       12        1       4      12AUG2008    13AUG2008
 5     00040903       01        .       5      13AUG2008    21AUG2008

答案 2 :(得分:0)

difftime
谢谢你,汤姆!和其他人一样!!!