我陷入了一项任务。
现在我有一个名为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;
非常感谢你,每个人!我真的很感激!
答案 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
谢谢你,汤姆!和其他人一样!!!