全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2116 9
2014-11-27
proc sort data = sdtm.dm(keep = USUBJID RFSTDTC) out = dm;
   by USUBJID RFSTDTC;
run;
proc sort data = cm;
      by USUBJID;
run;
data cm;
   merge dm(in=a) cm(in=b);
      by USUBJID;
   if b;
   if length(RFSTDTC) >= 10 then _RFSTDTC = input(substr(RFSTDTC,1,10),yymmdd10.);
   if length(CMSTDTC) >= 10 then _CMSTDTC = input(substr(CMSTDTC,1,10),yymmdd10.);
   if length(CMENDTC) >= 10 then _CMENDTC = input(substr(CMENDTC,1,10),yymmdd10.));
   if nmiss(_RFSTDTC,_CMSTDTC) = 0 then CMSTDY = _CMSTDTC - _RFSTDTC + (_RFSTDTC <= _CMSTDTC); *** BR 05;
   if nmiss(_RFSTDTC,_CMENDTC) = 0 then CMENDY = _CMENDTC - _RFSTDTC + (_RFSTDTC <= _CMENDTC); *** BR 06;
run;
二维码

扫码加我 拉你入群

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

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

全部回复
2014-11-27 16:56:27
现在详细描述一下问题:
dm部分不用管。
其中cm是可变的,比如ae。其中的变量CMSTDTC,CMENDTC也是可变的,比如AESTDTC,AEENDTC,而且变量名有这样的规律:前两个字母不一样,后面的字符一样。
其中XXSTDTC的值如同2012-12、2012-12-23、2012-12-12T12-等,为了计算,只能选择yymmdd10.的格式值。sq1有like "____-__-__%"这样的语法可以选择,但在data步中用不了。
如何写一个宏,使得只要需要选择数据集和变量,就可以完成计算,而且使得程序易读,运行效率快。我试了很多天,总是无法达成目标,希望我的问题说明白了。请大侠指点。
二维码

扫码加我 拉你入群

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

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

2014-11-27 17:00:51
这里我要用的是变量的值参与计算,而且这个变量名是可变的,如果把这个变量名做为一个宏变量,如何用它的值用于数字运算呢?
老夫观夜象,希望有大神出现。
二维码

扫码加我 拉你入群

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

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

2014-11-28 10:50:46
%macro br(domain=,outds=);
proc sql noprint;
   create table &outds. as
      select &domain..*,
                     case
                        when RFSTDTC like "____-__-__%" then input(substr(RFSTDTC,1,10),yymmdd10.)
                        else .
             end as RFSTDTC_,
                 case
                    when &domain.STDTC like  "____-__-__%" then input(substr(&domain.STDTC,1,10),yymmdd10.)
                        else .
             end as &domain.STDTC_,
                 case
                    when &domain.ENDTC like  "____-__-__%" then input(substr(&domain.ENDTC,1,10),yymmdd10.)
                        else .
                     end as &domain.ENDTC_,
                         case nmiss(calculated RFSTDTC_,calculated &domain.STDTC_)
                            when 0 then calculated &domain.STDTC_ - calculated RFSTDTC_ + (calculated RFSTDTC_ <= calculated &domain.STDTC_)
                                else .
                         end as &domain.STDY,
                         case nmiss(calculated RFSTDTC_,calculated &domain.ENDTC_)
                            when 0 then calculated &domain.ENDTC_ - calculated RFSTDTC_ + (calculated RFSTDTC_ <= calculated &domain.ENDTC_)
                                else .
                         end as &domain.ENDY
          from  sdtm.dm(keep = USUBJID RFSTDTC) as dm
                right join
                &domain.
          on dm.USUBJID = &domain..USUBJID
          order by USUBJID;
quit;
%mend;
二维码

扫码加我 拉你入群

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

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

2014-11-28 10:53:31
另外,追问如何利用%if %then %else修改上面的宏,使得当domian为ds时,且不存在XX.ENDTC时,不计算相应的变量。
二维码

扫码加我 拉你入群

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

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

2014-11-28 10:54:24
真心期待高手解答!
谢谢!
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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