sas:根据日期计算行数

时间:2019-12-16 13:12:25

标签: sas

我正在处理犯罪数据。现在,我有了下表crimes。每行都包含特定的犯罪(例如攻击):犯罪发生的日期(date)和犯罪者的个人ID(person)。

date       person     
------------------------------
02JAN2017       1        
03FEB2017       1      
04JAN2018       1     --> not to be counted (more than a year after 02JAN2017)
27NOV2017       2      
28NOV2018       2     --> should not be counted (more than a year after 27NOV2017)   
01MAY2017       3
24FEB2018       3
10OCT2017       4

我对每个人是否在同一个人犯下第一次罪行后一年内犯下(复发= 1)或未犯下(复发= 0)感兴趣。另一个条件是,第一次犯罪必须在特定年份(此处为2017年)内实施。

因此,结果应如下所示:

date       person     relapse
------------------------------
02JAN2017       1           1  
03FEB2017       1           1
04JAN2018       1           1
27NOV2017       2           0 
28NOV2018       2           0 
01MAY2017       3           1
24FEB2018       3           1
10OCT2017       4           0

任何人都可以给我一个关于如何在SAS中执行此操作的提示吗? 显然,实际数据要大得多,所以我无法手动进行。

2 个答案:

答案 0 :(得分:0)

一种方法是逐步使用DATA进行分组处理。

BY <var>语句设置二进制变量first.<var>last.<var>来标记组中的第一行和组中的最后一行。

您似乎在整个组中分配了已计算的 relapse 标志,并且这种计算可以通过SAS编码器称为DOW循环完成–带有{{1}的循环}循环内的语句,并具有将计算分配给组中每一行的后续循环。

SET函数可以计算两个日期之间的年数。

例如:

INTCK

如果实际流程是根据比“ 2017年第一个和下一个一年之内”更细微的规则将一个人的不同时间范围归类为复发或改革,则该过程将变得更加复杂,并且会有更多的簿记变量。

答案 1 :(得分:0)

我是最近才开始使用sas的-我决不是试图在这里创建完美的代码。

我先按ID /人和日期对数据进行排序(日期应为数字),然后使用保留语句对照第一次犯罪的日期进行检查。它不是完美的,但是如果您的数据很好(没有丢失的日期),它将可以正常工作,并且很容易跟踪恕我直言。

这仅在犯罪的第一记录和行为定于2017年发生时才有效。如果您在2016年发生犯罪,并想检查2017年是否犯有“犯罪”,然后检查复发,则此代码无法正常工作-但我认为这已包含在您的问题下方的注释中。

data test;
input tmp_year $ 1-9 person;  
datalines;
02JAN2017       1        
03FEB2017       1      
04JAN2018       1    
27NOV2017       2      
28NOV2018       2    
01MAY2017       3
24FEB2018       3
10OCT2017       4
;
run;

data test2;
    set test;
    crime_date = input(tmp_year, date9.);
    act_year = year(crime_date);
run;

proc sort data=test2;
   by person crime_date ;
run;

data want;
    set test2;
    by person crime_date;
    retain date_of_crime;
    if first.person and act_year = 2017 then date_of_crime = crime_date;
    else if first.person then call missing(date_of_crime);
    if intck('YEAR', date_of_crime, crime_date) =< 1 and not first.person 
    then relapse = 1;
    else relapse = 0;
run;

上面的代码标记了2017年犯罪行为发生后一年的犯罪行为。然后,您可以使用proc sql语句检索唯一人员,并将其与您拥有的任何数据集结合在一起。