Вы были так закрыты для вашего ответа.
Когда есть фрагмент кода, и он выглядит «правильным», но после того, как он передан синтаксическому анализатору, результат неверный, пора выполнить некоторую проверку и изменить, называемую debug
.
Основным методом отладки c является печать ключевого сообщения в журнале и определение места возникновения ошибок. Поэтому я добавляю оператор put
в ваш код:
data have;
input ID$ (Date_of_infusion1 Date_of_infusion2 Labdate1 Labdate2) (mmddyy10. +1);
format Date_of_infusion1 Date_of_infusion2 Labdate1 Labdate2 x e8601da.;
cards;
A 04/01/2016 08/06/2016 11/08/2017 10/21/2017
B 09/18/2015 . 09/22/2015 09/30/2015
;
run;
data want;
set have;
array infusion {*} date_of_infusion:;
array labdate {*} labdate:;
array flag {101} flag0-flag100;
do i= 1 to dim(labdate);
do j=1 to dim(infusion);
if infusion[j] ne . and infusion[j]<=labdate[i]<=intnx('month',infusion[j],4) then flag[i]=1;else flag[i]=0;
if flag[i]=1 then put ID flag0-flag1;
end;
end;
run;
Журнал показывает:
B 1 .
B 0 1
Видите, мы получили flag0 = 1, но потеряли его на следующей итерации. Только подумайте, почему это происходит, мы быстро понимаем, что l oop не должно продолжаться, когда у нас есть flag[i]=1
. В противном случае мы никогда не получим flag[i]=1
, если все date_of_infusion:
не будут соответствовать выражению судьи.
Итак, вот результат отладки.
data want;
set have;
array infusion {*} date_of_infusion:;
array labdate {*} labdate:;
array flag {101} flag0-flag100;
do i= 1 to dim(labdate);
do j=1 to dim(infusion);
if infusion[j] ne . and infusion[j]<=labdate[i]<=intnx('month',infusion[j],4) then flag[i]=1;else flag[i]=0;
if flag[i] then leave;
end;
end;
run;
Надеюсь, вам понравится время кодирования.