SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 980|回复: 8
打印 上一主题 下一主题

请教一个计算时间差的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-8-18 08:43:13 | 只看该作者

请教一个计算时间差的问题

背景:
每个病人在实验中有会吃实验药物,数据如下
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

我的问题是要算一个时间差:即病人该项检查时间距离“之前”最近一次服药的时间为多少小时。(注:若某一次检查的时间在该病人第一次服药时间之前,就计算该次检查距离第一次服药时间为多少小时,该值为负值)。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-8-18 10:07:25 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-8-18 10:49:04 | 只看该作者

Re: 请教一个计算时间差的问题

To hopewell :
已拜读。非常的感谢。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-8-18 12:01:51 | 只看该作者

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]
我也不敢肯定我是否理清其中的关系。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-8-18 15:17:33 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-8-18 16:00:09 | 只看该作者

Re: 请教一个计算时间差的问题

to: jingju11 and hopewell
问个问题,group by 1,2 这里的1,2从哪里来? 并非check 与dosing里面的数据啊。 这里的1,2具体什么意思?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-8-18 17:00:42 | 只看该作者

Re: 请教一个计算时间差的问题

1指check表的usubjid,2指check表的sampdtm,源自select语句中变量的列的位置
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-8-18 22:18:02 | 只看该作者

Re: 请教一个计算时间差的问题

<!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o --> ,看了这么多hopewell大侠的程序,不得不承认data步用的太精彩了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2010-8-19 08:01:47 | 只看该作者

Re: 请教一个计算时间差的问题

hopewell大侠的data step,让我经常很迷惑啊~~哈哈,由于本人水平太浅,难看懂大师的杰作啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 03:27 , Processed in 0.070146 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表