PatientID SvcDate OpCode Pay
---------- -------- ------- ----
101 01/13/2013 19 30.7
101 01/14/2013 12 11.3
101 01/16/2013 13 28.0
101 01/16/2013 12 60.2
101 02/09/2013 10 11.4
102 02/10/2013 12 9.2
102 02/10/2013 19 13.2
102 02/11/2013 13 32.1
102 02/12/2013 14 17.5
102 02/13/2013 15 10.2
102 02/19/2013 12 14.3
你好,
我试图对Opcode = 13
观测前后2天的Pay
变量求和。
例如,
对于PatientID = 101
,Opcode = 13
观测值落在SVCDate = 01/16/2013
上,所以我想将SVCDate = 01/14/2013
到SVCDate = 01/18/2013
的所有Pay
值相加。因此,这将包括PatientID = 101
的观察结果,其中Pay
变量为11.3
,28.0
和60.2
。
因此,操作应该是11.3 + 28.0 + 60.2 = 99.5
。
我想把这个99.5
放入一个有2个变量的新表:
PatientID
和DirectProcedureCost
。Patient 101
的DirectProcedureCost
将是99.5
。
我想循环遍历我所有的患者id,并能够获得每个患者的DirectProcedureCost
。SAS9.4中最好的方法是什么?
如果您是SAS的新手,我建议您以简单的方式使用它。
data have;
input PatientID SvcDate :mmddyy10. OpCode Pay;
format SvcDate mmddyy10.;
datalines;
101 01/13/2013 19 30.7
101 01/14/2013 12 11.3
101 01/16/2013 13 28.0
101 01/16/2013 12 60.2
101 02/09/2013 10 11.4
102 02/10/2013 12 9.2
102 02/10/2013 19 13.2
102 02/11/2013 13 32.1
102 02/12/2013 14 17.5
102 02/13/2013 15 10.2
102 02/19/2013 12 14.3
;
run;
proc sort;
by PatientID SvcDate;
run;
/*Get List of Date(InDt) from SvcDate - 2 to SvcDate + 2*/
data m1;
set have(where=(OpCode=13));
do InDt = SvcDate - 2 to SvcDate + 2;
output;
end;
run;
/*Get observations whose SvcDate falls in 'InDt'*/
data m2;
merge m1(in=_major_) have(rename=(SvcDate=InDt OpCode=InOpCode Pay=InPay));
by PatientID InDt;
if _major_;
run;
/*Sumup InPay on each rows by every single PatientID*/
data m3;
set m2;
by PatientID;
if first.PatientID then DirectProcedureCost = .;
DirectProcedureCost + InPay;
if last.PatientID then output;
drop InDt InOpCode InPay;
run;
如果你有很好的SQL实践经验,@Richard有一个很好的例子。
如果您至少具有初级的SAS编程水平,并且希望将其提高到11级,我建议您学习table lookup
(链接)。从@draycut的回答中使用Hash的方法就是其中之一。
这是我的方法。
让我知道这是否适合你,并随时询问。
data have;
input PatientID SvcDate :mmddyy10. OpCode Pay;
format SvcDate mmddyy10.;
datalines;
101 01/13/2013 19 30.7
101 01/14/2013 12 11.3
101 01/16/2013 13 28.0
101 01/16/2013 12 60.2
101 02/09/2013 10 11.4
102 02/10/2013 12 9.2
102 02/10/2013 19 13.2
102 02/11/2013 13 32.1
102 02/12/2013 14 17.5
102 02/13/2013 15 10.2
102 02/19/2013 12 14.3
;
data want;
if _N_ = 1 then do;
dcl hash h(dataset : "have", multidata : "Y");
h.definekey("PatientID", "SvcDate");
h.definedata("Pay");
h.definedone();
end;
set have;
where OpCode = 13;
DirectProcedureCost = 0;
do dt = SvcDate - 2 to SvcDate + 2;
do while(h.do_over(key : PatientID, key : dt) = 0);
DirectProcedureCost + Pay;
end;
end;
keep PatientID DirectProcedureCost;
run;
结果:
PatientID DirectProcedureCost
101 99.5
102 82.2
您可以使用Proc SQL
来计算目标行的值。
SQL查询被许多SAS和非SAS编码人员理解。
的例子:
proc sql;
create table want as
select
Center.PatientID
, Center.SvcDate as Op13Date
, sum(Pay) as DirectProcedureCost label='5 day costs centered on OpCode 13'
from
(select PatientID, SvcDate from have where OpCode = 13) as Center
join
have
on
have.PatientID = Center.PatientID
& have.SvcDate between Center.SvcDate-2 and Center.SvcDate+2
group
by Center.PatientID, Center.SvcDate
order
by Center.PatientID
;
如果数据可能包含且医疗服务策略允许患者在另一个OpCode = 13的2天内获得OpCode = 13的服务,则需要更复杂的查询