首页 > 解决方案 > 使用 sas 将一组日期与另一组日期进行比较

问题描述

我的数据集如下所示:

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      .           .

我想要做什么:对于每个 ID,如果实验室日期在任何输注日期之后但在该日期的 4 个月内(​​任何输注日期<=实验室日期<=输注日期 + 4 个月),则保留它;否则放弃labdate。

我想做的是:制作 2 个阵列,一个用于输注日期,一个用于实验室日期。然后创建一个与 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; 

但是,结果看起来不像我想要的......

任何帮助表示赞赏!谢谢!

标签: arraysdatesascompare

解决方案


你对你的回答者太封闭了。

当有一段代码看起来“正确”但提交给解析器后,结果是错误的,是时候做一些检查和修改了,调用debug.

调试的基本技术是将关键消息打印到日志并找到错误发生的位置。所以我将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,但在下一次迭代中丢失了它。想想它为什么会发生,我们很快就知道当我们有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;

希望你喜欢编码的时间。


推荐阅读