У меня есть следующий набор данных:
Data test;
Input id$ visit$ enrdate : mmddyy10. Vsdate : mmddyy10. ;
Format enrdate mmddyy10. Vsdate mmddyy10.;
Cards;
ABC01 00 1/2/2020 1/2/2020
ABC02 00 5/16/2020 5/16/2020
ABC02 06 5/16/2019 11/12/2019
CDC01 00 8/20/2019 8/20/2019
CDC01 06 8/20/2019 2/16/2020
EFG01 00 5/20/2020 5/20/2020
EFG02 00 12/2/2018 12/2/2018
EFG02 02 12/2/2018 1/31/2019
EFG02 06 12/2/2018 5/31/2019
EFG02 12 12/2/2018 12/2/2019
EFG03 00 3/3/2019 3/3/2019
EFG03 12 3/3/2019 3/2/2020
GFF04 00 6/2/2019 6/2/2019
GFF04 06 6/2/2019 .
;
Run;
Я хочу сделать следующее:
Подсчитайте, скольким из зачисленных в настоящее время участников все еще нужно посетить 6-месячный визит (v6), скольким нужны их 12-месячные (v12), скольким - 18-месячные (v18) и скольким - 24-месячные. (v24).
Например, из фиктивного набора данных мы можем видеть, что всем 7 участникам по-прежнему понадобятся их v18 и v24, поскольку ни у кого из них уже не было этих посещений, в то время как участникам ABC01 и EFG01 также нужны их v6 и v12 в дополнение к v18 и v24. Участникам ABC02 и CDC01 нужны только их v12 в дополнение к v18 и v24 и т. Д. Участник GFF04, с другой стороны, должен быть исключен из списка участников, которым по-прежнему нужен их v6, поскольку его визит должен был состояться где-то в декабре. 2019, но никогда не делал. Тем не менее, я все еще хочу считать, что ему нужны его версии 12, 18 и 24.
В общем, мы также хотим исключить участников, чьи даты регистрации были давно, но у них никогда не было других последующих посещений после этого. Например, если участник имеет enrdate = 20.01.2018, но после этого не было других посещений, то мы не будем считать его нуждающимся в каких-либо других посещениях, поскольку он, скорее всего, выбыл, поскольку сейчас июнь 2020 года и единственный визит, который у нас есть для него, - это один визит в зачисление.
Кроме того, если участнику было введено следующее посещение, но не предыдущее, мы не будем считать этого участника нуждающимся в этом предыдущем посещении (т. Е. Если участник уже имел, скажем, v12, но не v6, то он не будет засчитан как все еще нужна эта версия 6 и так далее; т.е. участник EFG03)
Наконец, я хочу, чтобы крайний срок был 19 августа 2021 года. Это означает, что такой участник, как CDC01, который был зачислен 20 августа 2019 года, должен будет получить свой v24 20 августа 2021 года, но это уже прошло после ограничения 19 августа 2021 года, поэтому этот участник будут учитываться только как требующие v12 месяцев и v18. И так далее.
Это то, что я делал до сих пор, но теперь я застрял и не знаю, как продолжить кодирование с учетом всех перечисленных выше условий.
Data long;
Set test;
Where visit in (“00”, “06”, “12”, “18”, “24”);
If vsdate ne .;
Run;
Proc sort data=long out=longsort;
By id;
Run;
Data wide;
Set longsort;
By id;
Keep id enrdate vsdate00-vsdate24;
Retain vsdate00-vsdate24;
ARRAY avsdate(00:24) vsdate00-vsdate24;
if first.ID then do;
do i = 00 to 24;
avsdate (i) =.;
end;
end;
avsdate(visit)=vsdate;
if last.ID then output;
run;
data wide_0;
set wide (keep=ID ENRDATE VSDATE00 VSDATE06 VSDATE12 VSDATE18 VSDATE24);
run;
data wide_final;
set wide_0;
attrib
vsdate00 format=mmddyy10. Informat=anydtdte.
vsdate06 format=mmddyy10. Informat=anydtdte.
Vsdate12 format=mmddyy10. Informat=anydtdte.
Vsdate18 format=mmddyy10. Informat=anydtdte.
Vsdate24 format=mmddyy10. Informat=anydtdte.
;
Если кто-нибудь может помочь мне с предложениями / образцами кода, это было бы очень полезно!
Спасибо!
visit
, но это, вероятно, зависит от того, как вы хотите фильтровать. И теперь я предполагаю, что вам нужно написать процедуру для проверки каждого наблюдения / идентификатора на пропущенные посещения - в зависимости от сложности вашего дела это действительно может стать утомительным, но, поскольку все идентификаторы независимы друг от друга, я подозреваю, что это правильный путь. Может быть, Риза права и есть способ получше, но это то, как он подходит. - person user190080   schedule 26.06.2020