SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 714|回复: 5
打印 上一主题 下一主题

求助:有哪位会写macro或者多重循环, 在线等,谢谢

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-1-18 22:30:57 | 只看该作者

求助:有哪位会写macro或者多重循环, 在线等,谢谢

我的数据库有以下四个变量,

PatientID   Diagnosis   Days            P
AAA            234            15           0.6
AAA            257            18           0.5
AAA            333            19           0.8
BBB             288            21           0.2
BBB             333            11          0.8
BBB             234            9            0.6
BBB             111            12          0.4
BBB             222            10          0.5
CCC            266             17         0.7
CCC            222              3          0.5
CCC            111             1           0.4
CCC            333             28         0.8
CCC            444             13         0.1
……………………

一个病人有很多行,一个病人的诊断是不重复的;不同病人相同的诊断P值是相同的;

现在要求做:
1)只要两个病人有一个Diagnosis相同,那么他们就是一个pair,例如A和B 定义一个新变量(pair);
2)根据Diagnosis,生成一个新变量m=p/(abs(days1-days2)); 如果这两个病人有两个或两个以上相同的diagnosis,要求把所有m求和;days1是病人A的某个Diagnosis对应的天数 ,days2是病人B相同diagnosis对应的天数

由于一个病人有很多diagnosis,所以他可以和很多人组成Pair,

最后产生的数据库有三个变量

patientID   pair         m的和


多谢帮助
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-1-19 02:09:18 | 只看该作者

Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢

days1-days2 ?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-1-22 11:32:49 | 只看该作者

Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢

看起来不是很复杂,但是pair怎么赋值?没说清楚?
用%do语句重复应该就可以搞定了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-1-25 04:18:54 | 只看该作者

Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢

问题看起来并不难,但你的问题有点看不太懂.
比如:对于diagnosis=333有三个病人(AAA,BBB,CCC)都有,那么days1/days2该如何定义? 是两两配对(共有三个m值),还是其他定义? 请把问题说得清楚明了一点.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-1-26 08:41:55 | 只看该作者

Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢

I did not use MACRO/multiple LOOPs, but a normal SAS.
[code:3l839s5r]data a;
input id $ diag d p;
cards;
a 1 12 .1
a 2 8 .2
a 3 4 .3
b 2 14 .2
b 3 23 .3
c 1 21 .1
c 2 29 .2
d 2 10 .2
;
run;
proc sort data=a; by id; run;
data aa; /*give id a new numeric name*/
do i=1 by 1 until (last.id);
set a;
by id;retain kg;
if first.id then k=1;
else k=0;
  kg+k;
  id1=kg;
output;
end;
run;

proc sql;/*find the pairs based on same diag*/
  create table b(drop=i k kg) as
   select d1.*,d2.id1 as id2 ,d2.d as d2
   from aa d1 left join aa d2
   on d1.diag=d2.diag
   where d1.id1^=d2.id1
   order by diag;
quit;

data bb; set b;/*create a new id3 based on related two ids*/
id3=catx('_',min(id1,id2),max(id1,id2));
run;

proc sql;/*calculate m values and sum them up based on related ids*/
create table c as
  select *,p/(abs(d-d2)) as m, sum(calculated m) as sum_m
   from bb
   group by id3;
quit;
c:
[/code:3l839s5r]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-1-26 09:11:17 | 只看该作者

Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢

the last procedure should be replaced by following code according to your request. and hope it is helpful.
[code:ns20t9sl]
proc sql;/*calculate m values and sum them up based on related ids*/
create table c(drop=m) as
  select id,id3,p/(abs(d-d2)) as m, sum(calculated m) as sum_m
   from bb
   group by id3;
quit;[/code:ns20t9sl]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 09:44 , Processed in 0.067334 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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