SAS9.4如何对日期范围内的值求和?


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/2013SVCDate = 01/18/2013的所有Pay值相加。因此,这将包括PatientID = 101的观察结果,其中Pay变量为11.3,28.060.2

因此,操作应该是11.3 + 28.0 + 60.2 = 99.5

我想把这个99.5放入一个有2个变量的新表:

PatientIDDirectProcedureCostPatient 101DirectProcedureCost将是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的服务,则需要更复杂的查询

最新更新