楼主: berry_li
1789 9

请问高手如何将下面的程序变成宏 [推广有奖]

  • 2关注
  • 0粉丝

高中生

40%

还不是VIP/贵宾

-

威望
0
论坛币
89 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
216 点
帖子
23
精华
0
在线时间
29 小时
注册时间
2014-11-27
最后登录
2015-10-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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;
二维码

扫码加我 拉你入群

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

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

关键词:length SUBSTR Input Merge Then 程序 如何

沙发
berry_li 发表于 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步中用不了。
如何写一个宏,使得只要需要选择数据集和变量,就可以完成计算,而且使得程序易读,运行效率快。我试了很多天,总是无法达成目标,希望我的问题说明白了。请大侠指点。

使用道具

藤椅
berry_li 发表于 2014-11-27 17:00:51 |只看作者 |坛友微信交流群
这里我要用的是变量的值参与计算,而且这个变量名是可变的,如果把这个变量名做为一个宏变量,如何用它的值用于数字运算呢?
老夫观夜象,希望有大神出现。

使用道具

板凳
berry_li 发表于 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;

使用道具

报纸
berry_li 发表于 2014-11-28 10:53:31 |只看作者 |坛友微信交流群
另外,追问如何利用%if %then %else修改上面的宏,使得当domian为ds时,且不存在XX.ENDTC时,不计算相应的变量。

使用道具

地板
berry_li 发表于 2014-11-28 10:54:24 |只看作者 |坛友微信交流群
真心期待高手解答!
谢谢!

使用道具

7
sas9.4 发表于 2014-11-29 01:34:36 |只看作者 |坛友微信交流群
自娱自乐吧

使用道具

8
Tigflanker 发表于 2014-11-29 12:56:34 |只看作者 |坛友微信交流群
如果你打算做AD的话,我建议一般情况下不要写宏,因为逻辑变性和data issue会让你的code禁不住修改。

不是efficacy的数据集,像ADCM,ADMH这些,真的也没必要写成宏;

另外你要明白:现在除了%do,再得其实都没必要写宏套在外面。

%let head = CM;

&head.STDTC  means  CMSTDTC.

RFSTDTC,应该有对应数值型的变量RFSTDT可用吧?

使用道具

9
Tigflanker 发表于 2014-11-29 13:07:57 |只看作者 |坛友微信交流群
berry_li 发表于 2014-11-28 10:53
另外,追问如何利用%if %then %else修改上面的宏,使得当domian为ds时,且不存在XX.ENDTC时,不计算相应的变 ...
我提个建议,你可以用%sysfunc + ifc来做相应控制,我举个简单例子:

首先你需要知道endtc在不在数据集中,我不太能记得attrn那一类的函数有没有能取到的,
实在赶时间你就去sashelp.vcolumn去抓一下

然后

proc sql noprint;
  ...
  select *, ... %sysfunc(ifc(&domain. = ds and &exist. = 1,%bquote(,endtc as ady),))
  ...

使用道具

10
berry_li 发表于 2014-12-1 10:12:39 |只看作者 |坛友微信交流群
非常感谢Tigflanker老师给我的建议和思路。
1、我想对各个domain只计算一次,故而用宏,批量产生,但确实某些灵活性反而降低。
2、RFSTDTC没有对应的数值型变量。
3、关于%sysfunc(ifc(&domain. = ds and &exist. = 1,%bquote(,endtc as ady),))
我用的是%sysfunc(ifc(&domain. = cm and &exist. = 1,%bquote(&domain.endtc as ady),"")),没报错,能用。
再次感谢Tigflanker老师的热心解答!
已有 1 人评分论坛币 收起 理由
Tigflanker + 5 不敢称老师哈,咱俩应该是同行。

总评分: 论坛币 + 5   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 07:19