楼主: dxystata
3986 16

如何用macro实现? [推广有奖]

11
dxystata 发表于 2014-3-2 04:33:31 |只看作者 |坛友微信交流群
牵你↗左手 发表于 2014-2-20 11:18
我根据他的思路写成了宏,输出数据集需要进行处理,删除空值观测,添加format
能否把"输出数据集需要进行处理,删除空值观测,添加format"补到你的程序中?谢谢!

使用道具

12
龙潭丰乐 学生认证  发表于 2014-3-2 11:14:35 |只看作者 |坛友微信交流群
牵你↗左手 发表于 2014-2-28 08:31
这是我的一个思路,可以改成宏的。
老师,你这个代码有问题。
  1. data c;
  2. retain sum a1 b1 c1 a2 b2 c2 a3 b3 c3;
  3.    set aaa(rename=(a1=aa b1=bb c1=cc));
  4.         by no;
  5.      if first.no then sum=1;
  6.      else sum+1;
  7.          array a{3}$ a1-a3;
  8.          array b{3} b1-b3;
  9.          array c{3} c1-c3;
  10.           if first.no then do i=1 to 3;
  11.            a{i}=.;
  12.            b{i}=0;
  13.            c{i}=0;
  14.           end;
  15.           a{sum}=aa;
  16.           b{sum}+bb;
  17.           c{sum}+cc;
  18.           if last.no ;
  19.      keep no a1 b1 c1 a2 b2 c2 a3 b3 c3 ;
复制代码

使用道具

dxystata 发表于 2014-3-2 04:33
能否把"输出数据集需要进行处理,删除空值观测,添加format"补到你的程序中?谢谢!
  1. %macro aaa(dsin=,
  2.            vars=,
  3.            invars=,
  4.            keepvars=,
  5.            dsout=,
  6.                    format=);
  7.         %let vars_num=%sysfunc(countw(&vars.,' '));
  8.         %let invars_num=%sysfunc(countw(&invars.,' '));
  9.         %let i_num=%eval(&vars_num/&invars_num);
  10.         %do i=1 %to &vars_num.;
  11.                 %let value&i=%SYSFUNC(SCAN(&vars.,&i,' '));
  12.         %end;
  13.         %do j=1 %to &invars_num.;
  14.                 %let name&j=%SYSFUNC(SCAN(&invars.,&j,' '));
  15.         %end;
  16.         data &dsout.;
  17.                 set &dsin.;
  18.                 keep &keepvars. &invars;
  19.                 %do i=1 %to &i_num;
  20.                         %do j=1 %to &invars_num;
  21.                                 %let k=%eval(&j+(&i-1)*&invars_num);
  22.                                 &&name&j=&&value&k;
  23.                         %end;
  24.                         output;
  25.                 %end;
  26.         run;
  27.                 data &dsout.;
  28.                         set &dsout.;
  29.                         where &name1 ne '';
  30.                         format &format.;
  31.                 run;
  32. %mend;


  33. %aaa(dsin=aaa,
  34.          vars=a1 b1 c1 a2 b2 c2 a3 b3 c3,
  35.          invars=a1 b1 c1,
  36.          keepvars=no,
  37.          dsout=aaa1,
  38.                  format=%str(b1 b1fmt. c1 c1fmt.));
复制代码
这样可不可以,多加了一个参数
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
teqel + 1 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 1  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

龙潭丰乐 发表于 2014-3-2 11:14
老师,你这个代码有问题。
  1. data c;
  2. retain no a1 b1 c1 a2 b2 c2 a3 b3 c3 ;
  3.    set aaa1(rename=(a1=aa b1=bb c1=cc));
  4.         by no;
  5.      if first.no then sum=1;
  6.      else sum+1;
  7.          array a{3}$ a1-a3;
  8.          array b{3} b1-b3;
  9.          array c{3} c1-c3;
  10.                  if first.no then do i=1 to 3;
  11.                         a{i}='';
  12.            b{i}=.;
  13.            c{i}=.;
  14.                   end;
  15.                  do i=1 to 3;
  16.           if sum=i then do ;
  17.            a{i}=aa;
  18.            b{i}=bb;
  19.            c{i}=cc;
  20.           end;
  21.          end;
  22.           if last.no ;
  23.      keep no a1 b1 c1 a2 b2 c2 a3 b3 c3 ;
  24. run;
复制代码
你这么改一下就好了

使用道具

15
eric_darcy 发表于 2014-3-13 23:03:45 |只看作者 |坛友微信交流群
学习拉

使用道具

16
geoffreychen829 学生认证  发表于 2015-1-4 23:55:51 |只看作者 |坛友微信交流群
学习中

使用道具

17
teqel 发表于 2015-1-5 00:41:07 |只看作者 |坛友微信交流群
牵你↗左手 发表于 2014-3-3 08:23
这样可不可以,多加了一个参数
这样也行
  1. %macro aaa(dsin=,
  2.            vars=,
  3.            invars=,
  4.            keepvars=,
  5.            dsout=,
  6.                    format=);
  7.         %let vars_num=%sysfunc(countw(&vars.,' '));
  8.         %let invars_num=%sysfunc(countw(&invars.,' '));
  9.         %let i_num=%eval(&vars_num/&invars_num);
  10.         %do i=1 %to &vars_num.;
  11.                 %let value&i=%SYSFUNC(SCAN(&vars.,&i,' '));
  12.         %end;
  13.         %do j=1 %to &invars_num.;
  14.                 %let name&j=%SYSFUNC(SCAN(&invars.,&j,' '));
  15.         %end;
  16.         data &dsout.;
  17.                 set &dsin.;
  18.                 keep &keepvars. &invars;
  19.                 %do i=1 %to &i_num;
  20.                         %do j=1 %to &invars_num;
  21.                                 %let k=%eval(&j+(&i-1)*&invars_num);
  22.                                 &&name&j=&&value&k;
  23.                         %end;
  24.                                                 if not missing(&name1) then do;
  25.                                                         format &format.;
  26.                                                         output;
  27.                                                 end;
  28.                 %end;
  29.         run;
  30. %mend;
复制代码

使用道具

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

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

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

GMT+8, 2024-4-26 23:09