楼主: gasxsnake
2596 9

[问答] 求助,想用宏在data步里做批量处理。 [推广有奖]

  • 0关注
  • 0粉丝

高中生

50%

还不是VIP/贵宾

-

威望
0
论坛币
2903 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
687 点
帖子
10
精华
0
在线时间
52 小时
注册时间
2015-6-11
最后登录
2017-8-12

楼主
gasxsnake 学生认证  发表于 2017-6-11 07:03:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
初学宏,感觉理解得不对,请问如何能做这种批量化处理,求大神带带。

无标题.png

%macro  combine(name=, length=);
&name=.; *先设置成missing;

%do i=1 %to &length;
%if &name___&&i=1 %then %do;
&name=&i;
%return;%end; *如果abc___x=1,则设置abc=x,退出循环;
%end;
%mend combine;

data datab;
set dataa;
%combine(name=abc, length=3)
*怎么调用都不对;
run;
我以为宏是可以当做一段文本,直接嵌入data步每次改参数(在这里是想要合并的列名,列数)就行,很显然不对




二维码

扫码加我 拉你入群

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

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

关键词:data步 Data 批量处理 combine missing return

已有 1 人评分热心指数 收起 理由
eijuhz + 1 鼓励积极发帖讨论

总评分: 热心指数 + 1   查看全部评分

沙发
gasxsnake 学生认证  发表于 2017-6-13 01:00:53
没人吗

藤椅
freetiger 发表于 2017-6-13 09:31:19
  1. data a;
  2. input abc_1 abc_2 abc_3;
  3. cards;
  4. 1 0 0
  5. 0 1 0
  6. 0 0 1
  7. 0 1 0
  8. ;
  9. run;

  10. %macro  combine(name=, length=);
  11. %do i = 1 %to &length.;
  12. if &name._&i.=1 then &name.=&i.;
  13. %end;
  14. %mend combine;

  15. data datab;
  16. set a;
  17. %combine(name=abc, length=3)
  18. run;
复制代码

板凳
freetiger 发表于 2017-6-13 09:31:27
如果需要碰到条件满足即终止:
  1. data a;
  2. input abc_1 abc_2 abc_3;
  3. cards;
  4. 1 0 0
  5. 0 1 1
  6. 0 0 1
  7. 0 1 0
  8. 0 0 0
  9. ;
  10. run;

  11. %macro  combine(name=, length=);
  12. %do i = 1 %to &length.;
  13.         if &name._&i.=1 then do;
  14.                 &name.=&i.;
  15.                 return;
  16.         end;
  17. %end;
  18. %mend combine;

  19. data datab;
  20. set a;
  21. %combine(name=abc, length=3)
  22. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
gasxsnake + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

报纸
albusdzx 发表于 2017-6-13 11:17:30
data test;
input abc_1 abc_2 abc_3;
datalines;
1 0 0
0 0 0
0 1 0
0 1 0
0 0 1
0 0 1
0 0 0
0 1 0
;

proc sql;
select nvar into:nvar
from dictionary.tables
where libname='WORK' and memname='TEST';
quit;
%put &nvar;

options mlogic symbolgen;

%macro test(name);
%do i=1 %to &nvar;
if &name._&i=1 then &name=&i;
%if (&name=&i or &i=&nvar) %then %goto leave;
%end;
%leave: if &name <0 then &name=.;
%mend;

data test2;
set test;
%test(abc);
run;

地板
gasxsnake 学生认证  发表于 2017-6-14 02:38:31
freetiger 发表于 2017-6-13 09:31
如果需要碰到条件满足即终止:
非常感谢啊,终于弄懂了{:2_37:}

7
gasxsnake 学生认证  发表于 2017-6-14 02:43:38
albusdzx 发表于 2017-6-13 11:17
data test;
input abc_1 abc_2 abc_3;
datalines;
谢谢,再问一下goto leave的leave是可以随意指定的吗? 比喻 leave1  leaveend?

8
8112mmw 发表于 2017-6-14 08:09:03
这个问题,判断条件比较简单,为什么不用if来做,是不是更简单?

9
albusdzx 发表于 2017-6-14 09:01:13
gasxsnake 发表于 2017-6-14 02:43
谢谢,再问一下goto leave的leave是可以随意指定的吗? 比喻 leave1  leaveend?
对 leave就是标签  标签起什么名字都行

10
gasxsnake 学生认证  发表于 2017-6-16 08:58:43
albusdzx 发表于 2017-6-14 09:01
对 leave就是标签  标签起什么名字都行
谢谢~~~~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 14:29