日期之间求和行的 SAS 代码
SAS Code for summing lines between dates
所以我有这样的数据
obs | date_of_service | units | CPT | ID
-----------------------------------------
1. | 11/03/2015 | 40 |xxxx6| 234
2. | 11/04/2015 | 1 |xxxx5| 234
3. | 11/11/2015 | 1 |xxxx5| 234
4. | 11/18/2015 | 1 |xxxx5| 234
5. | 11/20/2015 | 40 |xxxx6| 234
6. | 11/25/2015 | 1 |xxxx5| 234
7. | 12/02/2015 | 1 |xxxx5| 234
etc....
在许多 ID 的许多时间间隔内,
我需要做的是对每个间隔的 CPT xxxx6 之间的 obs 单位求和,因为它是一个非常大的数据集,具有许多唯一 ID。
好的,这就是我现在拥有的:
%MACRO lags();
%let n=1;
data out;
set in;
by id Date_of_service ;
DO _n_=&n. until (last.id);
if (id=lag&n.(id) and CPT="xxxx6") then do;
if units ne . then output;
call missing (TOTAL);
end;
if CPT="xxxx5" or CPT= "xxxx7" then TOTAL + count;
END;
run;
%MEND;
%lags
问题是,如果我连续有两个或多个 xxxx6,中间没有 xxxx5 或 xxxx7,我会得到空 (.) 值或 TOTAL 列中的 0。而且我没有得到所有带有 xxxx6 cpt 的 ID 的第一条观察线。
已编辑答案,因为我不知道如何 post 一个新答案:
查找 CPT="xxx6" 并在该点存储变量。然后通过下一行求和单元直到到达下一个 xxx6 并在重复之前输出。如果最后一组观察没有达到 xxx6,这将导致问题。另外,如果 ID 从 234 变为 235 中间单元计数会怎样?在解决方案中,将采用 234 作为 ID 求和。
data In;
infile cards;
input OBS DATE_OF_SERVICE:mmddyy10. UNITS CPT:. ID;
format DATE_OF_SERVICE date9.;
cards;
1 11/03/2015 40 xxxx6 234
2 11/04/2015 1 xxxx5 234
3 11/11/2015 1 xxxx5 234
4 11/18/2015 1 xxxx5 234
5 11/20/2015 41 xxxx6 234
6 11/25/2015 1 xxxx5 234
7 11/25/2015 1 xxxx5 234
8 11/25/2015 45 xxxx6 234
;
run;
data OUT(drop=ID UNITS DATE_OF_SERVICE OBS
rename=(STORE_UNITS=UNITS STORE_ID=ID STORE_DATE=DATE_OF_SERVICE STORE_OBS=OBS));
set IN;
retain STORE_OBS STORE_DATE STORE_UNITS STORE_ID;
if CPT="xxxx6" then do;
if STORE_UNITS ne . then output;
call missing (TOTAL);
STORE_UNITS=UNITS;
STORE_DATE=DATE_OF_SERVICE;
STORE_ID=ID;
STORE_OBS=OBS;
end;
if CPT="xxxx5" then TOTAL+UNITS;
run;
proc print; run;
所以我有这样的数据
obs | date_of_service | units | CPT | ID
-----------------------------------------
1. | 11/03/2015 | 40 |xxxx6| 234
2. | 11/04/2015 | 1 |xxxx5| 234
3. | 11/11/2015 | 1 |xxxx5| 234
4. | 11/18/2015 | 1 |xxxx5| 234
5. | 11/20/2015 | 40 |xxxx6| 234
6. | 11/25/2015 | 1 |xxxx5| 234
7. | 12/02/2015 | 1 |xxxx5| 234
etc....
在许多 ID 的许多时间间隔内, 我需要做的是对每个间隔的 CPT xxxx6 之间的 obs 单位求和,因为它是一个非常大的数据集,具有许多唯一 ID。
好的,这就是我现在拥有的:
%MACRO lags();
%let n=1;
data out;
set in;
by id Date_of_service ;
DO _n_=&n. until (last.id);
if (id=lag&n.(id) and CPT="xxxx6") then do;
if units ne . then output;
call missing (TOTAL);
end;
if CPT="xxxx5" or CPT= "xxxx7" then TOTAL + count;
END;
run;
%MEND;
%lags
问题是,如果我连续有两个或多个 xxxx6,中间没有 xxxx5 或 xxxx7,我会得到空 (.) 值或 TOTAL 列中的 0。而且我没有得到所有带有 xxxx6 cpt 的 ID 的第一条观察线。
已编辑答案,因为我不知道如何 post 一个新答案: 查找 CPT="xxx6" 并在该点存储变量。然后通过下一行求和单元直到到达下一个 xxx6 并在重复之前输出。如果最后一组观察没有达到 xxx6,这将导致问题。另外,如果 ID 从 234 变为 235 中间单元计数会怎样?在解决方案中,将采用 234 作为 ID 求和。
data In;
infile cards;
input OBS DATE_OF_SERVICE:mmddyy10. UNITS CPT:. ID;
format DATE_OF_SERVICE date9.;
cards;
1 11/03/2015 40 xxxx6 234
2 11/04/2015 1 xxxx5 234
3 11/11/2015 1 xxxx5 234
4 11/18/2015 1 xxxx5 234
5 11/20/2015 41 xxxx6 234
6 11/25/2015 1 xxxx5 234
7 11/25/2015 1 xxxx5 234
8 11/25/2015 45 xxxx6 234
;
run;
data OUT(drop=ID UNITS DATE_OF_SERVICE OBS
rename=(STORE_UNITS=UNITS STORE_ID=ID STORE_DATE=DATE_OF_SERVICE STORE_OBS=OBS));
set IN;
retain STORE_OBS STORE_DATE STORE_UNITS STORE_ID;
if CPT="xxxx6" then do;
if STORE_UNITS ne . then output;
call missing (TOTAL);
STORE_UNITS=UNITS;
STORE_DATE=DATE_OF_SERVICE;
STORE_ID=ID;
STORE_OBS=OBS;
end;
if CPT="xxxx5" then TOTAL+UNITS;
run;
proc print; run;