SAS - 循环变量和比较不同条目的日期?

时间:2017-10-25 19:21:49

标签: sas

我是SAS的新手,试图学习我分析任务所需的一切。我现在的任务是为正在进行的应用程序创建一个标志。我认为在表格中展示它可能更容易,只是为了说明我的问题:enter image description here

[更新2017.10.27]代码中的数据样本,非常感谢Richard :)

   data sample;
    input PeopleID ApplicationID Applied_date yymmdd10. Decision_date yymmdd10. Ongoing_flag_wanted;
format Applied_date Decision_date yymmdd10.;
datalines;
1 6 2017.10.1 2017.10.1 1
1 5 2017.10.1 2017.10.4 0
1 3 2017.9.28 2017.9.29 1
1 2 2017.9.26 2017.9.26 1
1 1 2017.9.25 2017.9.30 0
2 8 2017.10.7 2017.10.7 1
2 7 2017.10.2 .         0
3 4 2017.9.30 2017.10.3 0
run;

在系统中,人们申请服务。当一个人这样做时,他会获得一个PeopleID,当该人再次申请时,该ID不会改变。此外,每个应用程序都会获得一个applicationID,它是唯一的,后来的应用程序具有更大的applicationID。我想要的是为每个应用程序创建一个Ongoing标志。该提议表明:当该申请进入时,同一个人已经或没有正在进行的申请(申请未收到决定)。请参阅上表中的一些示例:

第2个人有两个应用程序#8和#7,当他应用#8时,#7尚未确定,因此#8应该获得持续标志。

人#1多次申请。由于App#1,应用程序#3和#2正在进行应用程序。应用程序#6和#5在同一天进入,但是根据应用程序ID,我们可以看出#6比#5晚了,而#5尚未决定,#6获得持续标志。< / p>

正如您可能已经注意到的那样,具有正向持续标志的应用程序始终会在其进入的同一天收到决策。这是因为正在进行的案例的应用程序会自动被拒绝。但是,我不能将此作为一个指标:还有很多其他原因导致自动下降。

proceed_flag是我想在我的数据集中创建的。我试图按1.peopleID排序,2。降低applicationID,3。降序applied_date,所以我的整个数据集看起来像上面的小例子表。但后来我不知道如何在同一个变量(peopleID)中进行 SAS比较,但不同的行(applicationID)和列(将Applied_date与Decision_date进行比较)。我想为每个人比较每个应用程序的apply_date以及之前的所有应用程序&#39; decision_date,这样我可以告诉该应用程序何时进入,是否存在以前在系统中正在进行的应用程序。

我知道我用了太多的词来解释我的问题。对于那些通读的人,谢谢你的阅读!对于那些对什么是好方法有任何想法的人,请留下您的意见!数百万的感谢!

1 个答案:

答案 0 :(得分:1)

敏:

对于此类问题,您希望在精神上将数据结构分解为不同的部分。

BY GROUP 唯一组合定义组的变量。组中有一行或多行。我们称之为物品。

小组详情 具有观察性的变量。它们可以是诸如温度,重量或美元之类的数字,或者表示被跟踪的某个状态的字符或字符串。细节(在您正在工作的状态)本身可能是聚合以获得更深层次的细节。

GOAL 计算其他变量,进一步阐明集团细节的一个方面。对于数字,目标可能是统计数据,如MIN,MAX,MEAN,MEDIAN,RANGE等。或者它可能是标识性的,例如哪个ID 最高$,或哪个名称最长,或任何其他商业规则。

您的具体问题是在给定日期确定声明活动。我认为它是一种覆盖类型的问题,因为有问题的日期涵盖范围。 BY GROUP是人和“活动”日期。

这是一种以数据为中心的方法。原始数据被扩展为每个日期有一行从应用到已决定。然后简单的BY组处理和自动第一。用于确定某个应用程序是否尚未确定。

../project $ python test.py

其他方法可能涉及数组,散列或SQL。 SQL与DATA Step代码非常不同,有些人认为它更清楚。

data have;
input PeopleID ApplicationID Applied_date yymmdd10. Decision_date yymmdd10. Ongoing_flag_wanted;
format Applied_date Decision_date yymmdd10.;
datalines;
1 6 2017.10.1 2017.10.1 1
1 5 2017.10.1 2017.10.4 0
1 3 2017.9.28 2017.9.29 1
1 2 2017.9.26 2017.9.26 1
1 1 2017.9.25 2017.9.30 0
2 8 2017.10.7 2017.10.7 1
2 7 2017.10.2 .         0
3 4 2017.9.30 2017.10.3 0
run;

data coverage;
  do _n_ = 1 by 1 until (last.PeopleID);
    set have;
    by PeopleID;
    if Decision_date > Max_date then Max_date = Decision_date;
  end;

  put 'NOTE: ' PeopleID= Max_date= yymmdd10.;

  do _n_ = 1 to _n_;
    set have;
    do Activity_date = Applied_date to ifn(missing(Decision_date),Max_date,Decision_date);
      if missing(Decision_date) then Decision_date = Max_date;
      output;
    end;
  end;

  keep PeopleID ApplicationID Applied_date Decision_date Activity_date;
  format Activity_date yymmdd10.;
run;

proc sort data=coverage;
  by PeopleID Activity_date ApplicationID ;
run;

data overlap;
  set coverage;
  by PeopleID Activity_date;

  Ongoing_flag = not (first.Activity_date);

  if Activity_date = Applied_date then
    output;
run;

proc sort data=overlap;
  by PeopleID descending ApplicationID ;
run;