SAS中文论坛

标题: 请教一个计算时间差的问题 [打印本页]

作者: shiyiming    时间: 2010-8-18 08:43
标题: 请教一个计算时间差的问题
背景:
每个病人在实验中有会吃实验药物,数据如下
usubjid(病人编号)  Visit(随访)    Dosing Time(吃药时间)
01-002              DAY 1          04NOV2006:08:00
01-002              DAY 4          07NOV2006:08:02
01-002              DAY 8          11NOV2006:07:50
01-002              DAY 11         14NOV2006:08:00
01-002              DAY 15         18NOV2006:07:22
01-002              DAY 18         21NOV2006:08:00
01-002              DAY 22         25NOV2006:08:01
01-002              DAY 25         28NOV2006:08:00
01-002              DAY 29         02DEC2006:08:00
01-003              DAY 1          04NOV2006:08:05
01-003              DAY 3          06NOV2006:08:15
01-003              DAY 5          08NOV2006:08:13
01-003              DAY 8          11NOV2006:07:50
01-003              DAY 10         13NOV2006:08:00
01-003              DAY 12         15NOV2006:08:05
01-003              DAY 15         18NOV2006:07:27
01-003              DAY 17         20NOV2006:08:00
01-003              DAY 19         22NOV2006:08:00
01-003              DAY 22         25NOV2006:07:58
01-003              DAY 24         27NOV2006:08:00
01-003              DAY 26         29NOV2006:08:05
01-005              DAY 1          04JAN2007:08:00
01-005              DAY 4          07JAN2007:08:02
01-005              DAY 8          11JAN2007:08:01
01-005              DAY 11         14JAN2007:08:00
01-005              DAY 15         18JAN2007:08:00
01-005              DAY 18         21JAN2007:08:00
01-005              DAY 22         25JAN2007:08:02
01-005              DAY 25         28JAN2007:08:00
01-005              DAY 29         01FEB2007:08:00
01-006              DAY 1          04JAN2007:08:05
01-006              DAY 4          07JAN2007:08:05
01-006              DAY 8          11JAN2007:08:03
01-006              DAY 11         14JAN2007:08:00
01-006              DAY 15         18JAN2007:08:05
01-006              DAY 18         21JAN2007:08:00
01-006              DAY 22         25JAN2007:08:05
01-006              DAY 25         28JAN2007:08:00
01-006              DAY 29         01FEB2007:08:05

另外一个数据为病人某一项检查的时间:

usubjid(病人编号)        sampdtm(样本采集时间)
01-002                   04NOV2006:07:50
01-002                   04NOV2006:09:01
01-002                   04NOV2006:10:00
01-002                   04NOV2006:11:01
01-002                   04NOV2006:12:00
01-002                   04NOV2006:14:00
01-002                   04NOV2006:16:00
01-002                   04NOV2006:20:00
01-002                   05NOV2006:02:00
01-002                   05NOV2006:08:01
01-002                   06NOV2006:08:00
01-002                   07NOV2006:07:57
01-002                   11NOV2006:07:37
01-002                   18NOV2006:07:14
01-002                   25NOV2006:07:49
01-002                   02DEC2006:07:50
01-002                   02DEC2006:09:00
01-002                   02DEC2006:10:00
01-002                   02DEC2006:11:00
01-002                   02DEC2006:12:00
01-002                   02DEC2006:14:00
01-002                   02DEC2006:16:00
01-002                   02DEC2006:20:00
01-002                   03DEC2006:02:00
01-002                   03DEC2006:08:00
01-002                   04DEC2006:08:00
01-002                   05DEC2006:07:53
01-002                   08DEC2006:07:33
01-003                   04NOV2006:07:53
01-003                   04NOV2006:12:05
01-003                   29NOV2006:07:52
01-003                   29NOV2006:12:05
01-003                   02DEC2006:08:02
01-005                   04JAN2007:07:50
01-005                   04JAN2007:12:00
01-005                   01FEB2007:07:51
01-005                   01FEB2007:12:00
01-006                   04JAN2007:07:55
01-006                   04JAN2007:09:05
01-006                   04JAN2007:10:05
01-006                   04JAN2007:11:08
01-006                   04JAN2007:12:09
01-006                   04JAN2007:14:06
01-006                   04JAN2007:16:05
01-006                   04JAN2007:20:05
01-006                   05JAN2007:02:05
01-006                   05JAN2007:08:05
01-006                   06JAN2007:08:08
01-006                   07JAN2007:08:00
01-006                   11JAN2007:08:00
01-006                   18JAN2007:08:00
01-006                   25JAN2007:08:02
01-006                   01FEB2007:07:55
01-006                   01FEB2007:09:06
01-006                   01FEB2007:10:07
01-006                   01FEB2007:11:06
01-006                   01FEB2007:12:05
01-006                   01FEB2007:14:06
01-006                   01FEB2007:16:05
01-006                   01FEB2007:20:05
01-006                   02FEB2007:02:05
01-006                   02FEB2007:08:05
01-006                   03FEB2007:07:54
01-006                   04FEB2007:07:18
01-006                   08FEB2007:07:49

我的问题是要算一个时间差:即病人该项检查时间距离“之前”最近一次服药的时间为多少小时。(注:若某一次检查的时间在该病人第一次服药时间之前,就计算该次检查距离第一次服药时间为多少小时,该值为负值)。
作者: shiyiming    时间: 2010-8-18 10:07
标题: Re: 请教一个计算时间差的问题
[code:dgf2o3j6]data dosing;
        input usubjid $ day $ Visit DosingTime datetime15.;
        format dosingtime datetime16.;
datalines;
01-002 DAY 1 04NOV2006:08:00
01-002 DAY 4 07NOV2006:08:02
01-002 DAY 8 11NOV2006:07:50
01-002 DAY 11 14NOV2006:08:00
01-002 DAY 15 18NOV2006:07:22
01-002 DAY 18 21NOV2006:08:00
01-002 DAY 22 25NOV2006:08:01
01-002 DAY 25 28NOV2006:08:00
01-002 DAY 29 02DEC2006:08:00
01-003 DAY 1 04NOV2006:08:05
01-003 DAY 3 06NOV2006:08:15
01-003 DAY 5 08NOV2006:08:13
01-003 DAY 8 11NOV2006:07:50
01-003 DAY 10 13NOV2006:08:00
01-003 DAY 12 15NOV2006:08:05
01-003 DAY 15 18NOV2006:07:27
01-003 DAY 17 20NOV2006:08:00
01-003 DAY 19 22NOV2006:08:00
01-003 DAY 22 25NOV2006:07:58
01-003 DAY 24 27NOV2006:08:00
01-003 DAY 26 29NOV2006:08:05
;
data check;
        input usubjid $ sampdtm datetime15.;
        format sampdtm datetime16.;
datalines;
01-002 04NOV2006:07:50
01-002 04NOV2006:09:01
01-002 04NOV2006:10:00
01-002 04NOV2006:11:01
01-002 04NOV2006:12:00
01-002 04NOV2006:14:00
01-002 04NOV2006:16:00
01-002 04NOV2006:20:00
01-002 05NOV2006:02:00
01-002 05NOV2006:08:01
01-002 06NOV2006:08:00
01-002 07NOV2006:07:57
01-002 11NOV2006:07:37
01-002 18NOV2006:07:14
01-002 25NOV2006:07:49
01-002 02DEC2006:07:50
01-002 02DEC2006:09:00
01-002 02DEC2006:10:00
01-002 02DEC2006:11:00
01-002 02DEC2006:12:00
01-002 02DEC2006:14:00
01-002 02DEC2006:16:00
01-002 02DEC2006:20:00
01-002 03DEC2006:02:00
01-002 03DEC2006:08:00
01-002 04DEC2006:08:00
01-002 05DEC2006:07:53
01-002 08DEC2006:07:33
01-003 04NOV2006:07:53
01-003 04NOV2006:12:05
01-003 29NOV2006:07:52
01-003 29NOV2006:12:05
01-003 02DEC2006:08:02
;
data temp;
        length type $10;
        set dosing(rename=(dosingtime=sampdtm) drop=day visit in=indosing)
                check(in=incheck);
        type=ifc(indosing,'dosing','check');
run;
proc sort data=temp;
        by usubjid sampdtm;
run;
data temp(drop=first_dosingtime dosingtime type);
        do _n_=1 by 1 until(last.usubjid);
                set temp;
                by usubjid;
                if type='dosing' then first_dosingtime=min(first_dosingtime,sampdtm);
        end;
        do _n_=1 to _n_;
                set temp;
                if type='dosing' then dosingtime=sampdtm;
                else if type='check' then do;
                        if missing(dosingtime) then diff=sampdtm-first_dosingtime;
                        else diff=sampdtm-dosingtime;
                end;
                if type='check' then output;
                format diff time10.;
        end;
run;[/code:dgf2o3j6]
作者: shiyiming    时间: 2010-8-18 10:49
标题: Re: 请教一个计算时间差的问题
To hopewell :
已拜读。非常的感谢。
作者: shiyiming    时间: 2010-8-18 12:01
标题: Re: 请教一个计算时间差的问题
[code:avl6i8q1]proc sql number;
        select distinct c. *,
                        case when (max(sampdtm-DosingTime) <= 0) then max(sampdtm-DosingTime)
                                 when (min(sampdtm-DosingTime) <= 0) then min(ifn(sampdtm-DosingTime <0, ., sampdtm-DosingTime))
                                 else min(sampdtm-DosingTime)
                                end as dif format =time10.
                from check c left join dosing d on         c.usubjID = d. usubjID group by 1, 2;
quit;[/code:avl6i8q1]
我也不敢肯定我是否理清其中的关系。。。
作者: shiyiming    时间: 2010-8-18 15:17
标题: Re: 请教一个计算时间差的问题
to jingju11: 不错,不错
终于看懂了,续个狗尾,希望是对的 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
[code:1ckkicol]proc sql number;
        select distinct c&#46;*,
                        case
                                when sampdtm le min(DosingTime) then sampdtm-min(DosingTime)
                                when sampdtm ge max(DosingTime) then sampdtm-max(DosingTime)
                                else min(ifn(sampdtm lt DosingTime,&#46;,sampdtm-DosingTime))
            end as dif format=time10&#46;
                from check c left join dosing d
                        on c&#46;usubjID=d&#46;usubjID
                group by 1,2;
quit;[/code:1ckkicol]
作者: shiyiming    时间: 2010-8-18 16:00
标题: Re: 请教一个计算时间差的问题
to: jingju11 and hopewell
问个问题,group by 1,2 这里的1,2从哪里来? 并非check 与dosing里面的数据啊。 这里的1,2具体什么意思?
作者: shiyiming    时间: 2010-8-18 17:00
标题: Re: 请教一个计算时间差的问题
1指check表的usubjid,2指check表的sampdtm,源自select语句中变量的列的位置
作者: shiyiming    时间: 2010-8-18 22:18
标题: Re: 请教一个计算时间差的问题
<!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o --> ,看了这么多hopewell大侠的程序,不得不承认data步用的太精彩了。
作者: shiyiming    时间: 2010-8-19 08:01
标题: Re: 请教一个计算时间差的问题
hopewell大侠的data step,让我经常很迷惑啊~~哈哈,由于本人水平太浅,难看懂大师的杰作啊。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2