SAS中文论坛

标题: 求助:有哪位会写macro或者多重循环, 在线等,谢谢 [打印本页]

作者: shiyiming    时间: 2010-1-18 22:30
标题: 求助:有哪位会写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的和


多谢帮助
作者: shiyiming    时间: 2010-1-19 02:09
标题: Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢
days1-days2 ?
作者: shiyiming    时间: 2010-1-22 11:32
标题: Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢
看起来不是很复杂,但是pair怎么赋值?没说清楚?
用%do语句重复应该就可以搞定了。
作者: shiyiming    时间: 2010-1-25 04:18
标题: Re: 求助:有哪位会写macro或者多重循环, 在线等,谢谢
问题看起来并不难,但你的问题有点看不太懂.
比如:对于diagnosis=333有三个病人(AAA,BBB,CCC)都有,那么days1/days2该如何定义? 是两两配对(共有三个m值),还是其他定义? 请把问题说得清楚明了一点.
作者: shiyiming    时间: 2010-1-26 08:41
标题: 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]
作者: shiyiming    时间: 2010-1-26 09:11
标题: 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]




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