我正在处理犯罪数据。现在,我有了下表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中执行此操作的提示吗? 显然,实际数据要大得多,所以我无法手动进行。
答案 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语句检索唯一人员,并将其与您拥有的任何数据集结合在一起。