我已经尝试使用谷歌搜索了,我没有把运气转向我目前的问题。也许有人可以提供帮助?
我有一个包含以下变量的数据集:
身份证,事故日期
它是长格式的,每个参与者可能有超过1次事故,参与者不一定有相同数量的事故。这是一个示例:
代码:
ID AccidentDate
1 1JAN2001
2 4MAY2001
2 16MAY2001
3 15JUN2002
3 19JUN2002
3 05DEC2002
4 04JAN2003
我需要做的是计算每个人第一次和最后一次记录的事故日期之间的天数。我一直在玩first.byvariable和last.byvariable命令,但我只是没有取得任何进展。有小费吗?或任何链接到源?
谢谢,
另外。我最初是在Talkstats.com上发布的(交叉发布礼仪)
答案 0 :(得分:4)
不确定你的长格式是什么意思 长格式应该是这样的
id accident date
1 1 1JAN2001
1 2 1JAN2002
2 1 1JAN2001
2 2 1JAN2003
然后你可以尝试像这样的proc sql
Proc Sql;
select id, max(date)-min(date) from table;
group by id;
run;
答案 1 :(得分:0)
通过长格式我认为你的意思是它是一个“堆积”的数据集,每个人都有多个观察结果(而不是每个人有多列的一行)。在您的情况下,这可能是存储数据的正确方法。
要使用数据步骤,我认为你首先走在正确的轨道上。最后。
我会这样做:
proc sort data=accidents;
by id date;
run;
data accidents; set accidents;
by id accident; *this is important-it makes first. and last. available for use;
retain first last;
if first.date then first=date;
if last.date then last=date;
run;
现在您有一个包含ID,日期,首次发生意外日期,最后一次意外日期
的数据集您可以计算
之间的时间data accidents; set accidents;
timebetween = last-first;
run;
你不能直接在同一个数据步骤中这样做,因为“last”变量在解析最后一行之前是不准确的,因此除了上次事故观察之外的任何数据都是错误的。 / p>
答案 2 :(得分:0)
假设数据如下:
ID AccidentDate
1 1JAN2001
2 4MAY2001
2 16MAY2001
3 15JUN2002
3 19JUN2002
3 05DEC2002
4 04JAN2003
你有正确的想法。保留第一个事故日期,以便能够访问第一个和最后一个日期。然后计算差异。
proc sort data=accidents;
by id accidentdate
run;
data accidents;
set accidents;
by id;
retain first_accidentdate;
if first.id then first_accidentdate = accidentdate;
if last.id then do;
daysbetween = date - first_accidentdate
output;
end;
run;