全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2087 5
2016-01-27
我发现多行宏命令同时执行时的结果与多行命令分别单一执行的结果好像不一致。不知道是不是因为macro编写的不够完善导致上一行命令与下一行命令之间相互影响了。比如选择%screen(input1, output1); %screen(input2, output2); %screen(input3, output3); 这三行命令并同时运行的结果,与运行%screen(input1, output1);,结果出来以后在运行 %screen(input2, output2);,结果出来以后再运行%screen(input3, output3);,这样的结果不一致。

请问各位有碰见过这个问题吗?如果有的话,还望指教原因。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-1-27 13:36:13
%screen的代码是什么?
从目前的情况看,应该是不够完善导致上一行命令与下一行命令之间相互影响
我的推测是,宏变量的命名空间产生了重叠。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-27 15:35:57
不会出现这种情况的。请仔细验证一下,可能你的程序有随机处理的步骤,导致每次都不同而已。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 01:31:42
co_fund 发表于 2016-1-27 13:36
%screen的代码是什么?
从目前的情况看,应该是不够完善导致上一行命令与下一行命令之间相互影响
我的推测 ...
%macro screen(input1,input2,input3,input4,output1,output2,output3,output4);

data &output1 REPLACE;
set &input1;

                ipnum=1;
                chemo=0;
                radi=0;
                HGF=0;
                ems=0;
                surgb1=0;
                surgb2=0;
                surgc1=0;
                surgc2=0;
               
                        dx_date1=LEFT(SRVC_BGN_DT);
                        dtdx=SUBSTR(dx_date1, 7, 2); modx=SUBSTR(dx_date1, 5, 2); yrdx=SUBSTR(dx_date1, 1, 4);
                        cldt=MDY(modx, dtdx, yrdx);



        /*revenue*/
                        IF UB_92_REV_CD_GP_1 in (0331, 0332, 0335) THEN chemo=1;
                        IF UB_92_REV_CD_GP_1 in (0330, 0333) THEN radi=1;
                        IF UB_92_REV_CD_GP_1 in (0450, 0451, 0452, 0456, 0459, 0981) THEN ems=1;


        /*icd-9*/
                ARRAY dgncdclms(9) DIAG_CD_1-DIAG_CD_9;
                                 do i=1 to 9;
                                         if dgncdclms(i) in ('V581' 'V662' 'V672') THEN chemo=1;
                                 end;
                                 drop i;

        *CPT code;
                                ARRAY prcdr(6) PRCDR_CD_1-PRCDR_CD_6;
                                do j=1 to 6;
                                        if prcdr(j) in ('J8510' 'J8520' 'J8521' 'Q0083' 'Q0084' 'Q0085' 'C9214' 'S0116' 'C9257' 'C9125' 'C9235')
                                                                OR prxmatch('/J[8][5][3-9]\d/', prcdr(j))
                                                                OR prxmatch('/J[8][6-9]\d\d/', prcdr(j))
                                                                OR prxmatch('/J[9]\d\d\d/', prcdr(j))
                                                                OR prcdr(j) in ( 96400:96549 ) then chemo=1;

                                        if prcdr(j) in ( 77401:77499, 77750:77799, 77261:77399) then radi=1;
                                        IF prcdr(j) in ('J1440' 'J1441' 'J2505' 'J2820' 'J0880' 'J0881' 'J0885' 'Q0136' 'Q0137') THEN HGF=1;
                                        IF prcdr(j) in (19120, 19160, 19162) THEN surgb1=1;
                                        IF prcdr(j) in (19240, 19220, 19180) THEN surgb2=1;
                                        IF prcdr(j) in (44140:44160) THEN surgc1=1;
                                        IF prcdr(j) in ( 45110:45121) THEN surgc2=1;
                                end;
                                 drop j;
                KEEP BENE_ID chemo radi HGF ems surgb1 surgb2 surgc1 surgc2 cldt ipnum;
                       
run;

PROC SORT DATA=&output1;
        BY BENE_ID;
        RUN;

DATA &output1;
        MERGE &output1(IN=k) &input4;
                BY BENE_ID;
                IF k;
                RUN;

DATA &output1;
        SET &output1;
                pryrdif=YRDIF(cldt, dod, 'ACTUAL');
                IF 0<pryrdif<0.5;
                DROP k;
                RUN;


data &output2 REPLACE;
set &input2;

                chemo=0;
                radi=0;
                HGF=0;
                ems=0;
                surgb1=0;
                surgb2=0;
                surgc1=0;
                surgc2=0;

                        dx_date1=LEFT(SRVC_BGN_DT);
                        dtdx=SUBSTR(dx_date1, 7, 2); modx=SUBSTR(dx_date1, 5, 2); yrdx=SUBSTR(dx_date1, 1, 4);
                        cldt=MDY(modx, dtdx, yrdx);

                                        if PRCDR_CD in ('J8510' 'J8520' 'J8521' 'Q0083' 'Q0084' 'Q0085' 'C9214' 'S0116' 'C9257' 'C9125' 'C9235')
                                                                OR prxmatch('/J[8][5][3-9]\d/', PRCDR_CD)
                                                                OR prxmatch('/J[8][6-9]\d\d/', PRCDR_CD)
                                                                OR prxmatch('/J[9]\d\d\d/', PRCDR_CD)
                                                                OR PRCDR_CD in ( 96400:96549 ) then chemo=1;

                                        if PRCDR_CD in ( 77401:77499, 77750:77799, 77261:77399) then radi=1;
                                        IF PRCDR_CD in ('J1440' 'J1441' 'J2505' 'J2820' 'J0880' 'J0881' 'J0885' 'Q0136' 'Q0137') THEN HGF=1;
                                        IF PRCDR_CD in (19120, 19160, 19162) THEN surgb1=1;
                                        IF PRCDR_CD in (19240, 19220, 19180) THEN surgb2=1;
                                        IF PRCDR_CD in (44140:44160) THEN surgc1=1;
                                        IF PRCDR_CD in ( 45110:45121) THEN surgc2=1;

                KEEP BENE_ID chemo radi HGF ems surgb1 surgb2 surgc1 surgc2 cldt;

run;


PROC SORT DATA=&output2;
        BY BENE_ID;
        RUN;

DATA &output2;
        MERGE &output2(IN=k) &input4;
                BY BENE_ID;
                IF k;
                RUN;

DATA &output2;
        SET &output2;
                pryrdif=YRDIF(cldt, dod, 'ACTUAL');
                IF 0<pryrdif<0.5;
                drop k;
                RUN;


DATA &output3 REPLACE;
        SET &input3;

                        dx_date1=LEFT(SRVC_BGN_DT);
                        dtdx=SUBSTR(dx_date1, 7, 2); modx=SUBSTR(dx_date1, 5, 2); yrdx=SUBSTR(dx_date1, 1, 4);
                        cldt=MDY(modx, dtdx, yrdx);

                ARRAY dgncdclms(5) DIAG_CD_1-DIAG_CD_5;
                                 do i=1 to 5;
                                         if dgncdclms(i) in ('V581' 'V662' 'V672') THEN chemo=1;
                                 end;
                                 drop i;

                KEEP BENE_ID chemo radi HGF ems surgb1 surgb2 surgc1 surgc2 cldt;

RUN;


PROC SORT DATA=&output3;
        BY BENE_ID;
        RUN;

DATA &output3;
        MERGE &output3(IN=k) &input4;
                BY BENE_ID;
                IF k;
                RUN;

DATA &output3;
        SET &output3;
                pryrdif=YRDIF(cldt, dod, 'ACTUAL');
                IF 0<pryrdif<0.5;
                DROP k;
                RUN;

data &output4 REPLACE;
        SET &output3 &output1 &output2;
        keep BENE_ID chemo radi HGF ems surgb1 surgb2 surgc1 surgc2 cldt ipnum;
run;

%mend screen;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 01:32:52
co_fund 发表于 2016-1-27 13:36
%screen的代码是什么?
从目前的情况看,应该是不够完善导致上一行命令与下一行命令之间相互影响
我的推测 ...
抱歉,screen的代码贴在上面了,有点长。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 09:34:03
程序好长,看着没什么问题。
能具体描述一下,分别运行时和同时运行时有哪些差别吗。
另外,在找到差别后,可以在宏程序中用%put显示中间数据,看看是哪里的调用出现了问题。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群