Я застрял в одной задаче.
Теперь у меня есть переменная, называемая размещением, которая имеет две категории: вне дома и дома (здесь для краткости A и B). Кейс можно разместить в AAABAB последовательно. У каждого места размещения есть дата начала и дата окончания, например, 20.01.2015 - 21.02.2015 для первого A, 21.02.2015 - 8.05.2015 для второго A и т. Д.
Теперь я структурировал данные так: 111.1. (A как 1 и B как отсутствует). Как я могу совмещать время работы вне дома? То есть используйте дату начала первого A как дату начала, используйте дату окончания третьего A как дату окончания. Это будет первый период, когда пациент находится вне дома. Я думаю об использовании для этого цикла do. Но не могу понять, как это сделать.
Я думаю, что еще один способ сделать это - определить группы вне дома, например, AAABAABAAAA можно обозначить как 11123345555. Затем я могу использовать функцию PROC SQL, min и max, чтобы найти дату начала и дату окончания.
proc sql; создать таблицу comb как select *, min (strtdt) как minstrtdt, max (livarenddt) как maxenddt из группы limt по 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 .
У кого-нибудь есть идеи? Спасибо!!
ОБНОВИТЬ,
Теперь я изменил свои данные, 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 (разные открытые последовательности). Как я могу включить эту переменную в код, чтобы не сжимать их вместе? Высоко оценен !!!
Результат должен быть таким: Obs caseid livaropnseq livarstrtdt livarenddt placemnt out
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;
Большое вам спасибо, ВСЕМ !! Я очень это оценил!