【问题标题】:Using sas to compare one sets of dates with another sets of dates使用 sas 将一组日期与另一组日期进行比较
【发布时间】:2020-06-17 01:01:36
【问题描述】:

我的数据集如下所示:

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 个月内(​​任何输注日期

我想做什么: 制作 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; 

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

感谢任何帮助!谢谢!

【问题讨论】:

标签: arrays date sas compare


【解决方案1】:

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

当有一段代码看起来“正确”但提交给解析器后,结果是错误的,是时候做一些检查和修改,称为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;

希望您享受编码的时光。

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多