Использование sas для сравнения одних наборов дат с другими наборами дат - PullRequest
1 голос
/ 17 июня 2020

Мой набор данных выглядит следующим образом:

ID   Date_of_infusion1   Date_of_infusion2...Date_of_infusion33   Labdate1   Labdate2  ...Labdate100
A     04/01/2016            08/06/2016               .           11/08/2017  10/21/2017      .
B     09/18/2015                .                    .           09/22/2015  09/30/2015      .
C     11/24/2015                .                    .           07/05/2015      .           .

Что я хочу сделать: для каждого идентификатора, если labdate находится после любой из дат вливания, но в пределах 4 месяцев с этой даты (любая дата вливания <= labdate <= дата инфузии + 4 месяца), затем сохраните; в противном случае опустите labdate. </p>

То, что я пытался сделать: сделать 2 массива, один для дат вливания, один для labdates. Затем создайте «флаговую» переменную, связанную с Labdate.

Я написал что-то вроде этого:

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;
    end;

end; 

Однако результат не похож на то, что я хочу ...

Любая помощь приветствуется! Спасибо!

1 Ответ

1 голос
/ 17 июня 2020

Вы были так закрыты для вашего ответа.

Когда есть фрагмент кода, и он выглядит «правильным», но после того, как он передан синтаксическому анализатору, результат неверный, пора выполнить некоторую проверку и изменить, называемую 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;

Надеюсь, вам понравится время кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...