SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3481|回复: 20
打印 上一主题 下一主题

请教问题: SAS 编程

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-3-4 11:26:38 | 只看该作者

请教问题: SAS 编程

有一个困扰我多时的问题:

问: 在30天内,有多少病人服用了超过2种药物?SAS数据中的变量有:病人ID, 用药日期以及对应的药名。

id        date            medicine
1        2010jan01          a
1        2010jan04          a
1        2010jan16          a
1        2010feb04            b
2        2010mar03           c
2        2010mar04           c
....

假设数据量很大,有30万行

敬请牛人指教如何用SAS实现,并且计算机用时越少越好。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-3-5 01:20:21 | 只看该作者

Re: 请教问题: SAS 编程

So far, no one solve my problem. I am wondering if I describe the problem clearly, or my problem is so easy that no one care about it?

Please help me and thanks millions!

^_^
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-3-5 11:09:42 | 只看该作者

Re: 请教问题: SAS 编程

可以用sas的自我匹配技术,不知道是不是你要的
proc sql;
        create table one as
        select  id, drug, min(date) as startdate
     from raw
         group by id, drug
;quit;

proc sql;
        create table output as
     select  distinct id as patient,  'Y' as indicator 'Patient who had more than 2 drugs in 30 day'
      from one as a , one as b
      where a.id = b.id
                        and (a.startdate - b.startdate)  le 30
;quit;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-3-5 13:04:35 | 只看该作者

Re: 请教问题: SAS 编程

看不太懂这句 (a.startdate - b.startdate) le 30,我先琢磨琢磨自我匹配技术。 非常感谢高人的解决方法!

^_^
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-3-5 16:39:41 | 只看该作者

Re: 请教问题: SAS 编程

hash或者double set

如果楼主给出一段可以试的伪数据(楼主的日期是非标格式,并且数据太少),我可以试一试。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-3-5 22:43:52 | 只看该作者

Re: 请教问题: SAS 编程

[quote:4qsiueqo]楼主的日期是非标格式,[/quote:4qsiueqo]

可以用ANYDTDTE.informat来读。
我曾经问过猪头类似的程序。
我感觉这个问题不是很容易。得出30天内不同药的名字和个数不是很难。可是标定出每个药的日期有些麻烦。
我的思路是:
这个问题可以看成是每种药物的开始日期即为date,而假定的结束日期为date+30.而30内用的药即为每个小阶段里存在的药物。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-3-5 23:50:47 | 只看该作者

Re: 请教问题: SAS 编程

楼主,这个行吗 ?

[code:w6une77r]data raw;
input id date $10. drug $1.;
date=input(catt(substr(date,8,2), substr(date,5,3),substr(date,1,4)), date12.);
cards;
1 2010jan01 a
1 2010jan04 a
1 2010jan16 a
1 2010feb04 b
1 2010feb17 a
1 2010mar08 c
2 2010feb10 c
2 2010feb14 c
2 2010mar03 b
2 2010mar04 c
3 2010jan16 a
3 2010jan18 a
3 2010mar04 c
;
run;
proc sort  data=raw out=ex;
   by id  date drug;
run;

data ex;
   set ex;
   if id=lag(id) and   0 <= date-lag(date)< 30 and drug ne lag(drug);
run;
proc sql;
   select id as patient, 'Y' as indicator 'Patient who had more than 2 drugs in 30 day'
          from ex;
quit;        [/code:w6une77r]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-3-6 00:06:05 | 只看该作者

Re: 请教问题: SAS 编程

@sxlion
个人感觉仅用 date-lag(date) 可能会不严谨吧
数据太少,不好测试...
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-3-6 08:55:09 | 只看该作者

Re: 请教问题: SAS 编程

考虑过lag的局限,不过对于楼主这个问题好像OK。

楼主要是说3个的话,就有点麻烦了,两个的话就投机点的想到了这个,不知道有没bug,楼主试试才知道。

ps: 后面的sql 加一点。
[code:3ngn1xxz]proc sql;
   select distinct  id as patient, 'Y' as indicator 'Patient who had more than 2 drugs in 30 day'
          from ex
          group by id;
quit;[/code:3ngn1xxz]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-3-6 09:49:25 | 只看该作者

Re: 请教问题: SAS 编程

这个程序真是很好。
lag 在这里应该没有问题。因为这根本不是条件性地执行lag。对于记录的每一行,lag都例行执行一次。
不过说实在的,如果问题只是想知道某个人是否在30天吃过至少两种药的话,那么这个程序也没有什么难度可言。我以为他需要重合的具体的药的名称,用药时间等等。另外,如果只是30万的记录,讲程序的效率也就没有什么大的意思。其实,对于常规的过程,运行30万次,对于sas来说也不过是几分钟(或者十几分钟)而已。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 06:15 , Processed in 0.076827 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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