楼主: dxystata
3994 16

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

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182615 个
通用积分
15207.3903
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291545 点
帖子
5381
精华
1
在线时间
13484 小时
注册时间
2006-6-21
最后登录
2024-5-1

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

200论坛币
  1. data aaa;
  2. infile cards missover;
  3. input no a1$ b1 c1 a2$ b2 c2 a3$ b3 c3;
  4. cards;
  5. 1 x1 1 1 z1 2 1 y1 1 2
  6. 2 x2 1 2 y2 1 2
  7. 3 x3 2 2
  8. ;
  9. run;

  10. proc format;
  11. value b1fmt 1="a" 2="b";
  12. value c1fmt 1="m" 2="f";
  13. run;


  14. data bbb;
  15. infile cards missover;
  16. input no a1$ b1 a2$ b2 a3$ b3;
  17. cards;
  18. 1 x1 1 z1 2 y1 1
  19. 2 x2 1 y2 1
  20. 3 x3 2
  21. ;
  22. run;

  23. proc format;
  24. value b1fmt 1="a" 2="b";
  25. run;
复制代码
如何用macro实现?
%aaa(dsin=aaa,
         vars=a1 b1 c1 a2 b2 c2 a3 b3 c3,
         invars=a1 b1 c1,
         keepvars=no,
         dsout=aaa1);
希望得到的数据集
no a1 b1 c1
1 x1 a m
1 z1 b m
1 y1 a f
2 x2 a f
2 y2 a f
3 x3 b f


%aaa(dsin=bbb,
         vars=a1 b1 a2 b2 a3 b3,
         invars=a1 b1,
         keepvars=no,
         dsout=bbb1);


希望得到的数据集
no a1 b1
1 x1 a
1 z1 b
1 y1 a
2 x2 a
2 y2 a
3 x3 b


最佳答案

牵你↗左手 查看完整内容

我根据他的思路写成了宏,输出数据集需要进行处理,删除空值观测,添加format
关键词:Macro acr CRO Mac 如何用 如何

本帖被以下文库推荐

沙发
牵你↗左手 发表于 2014-2-20 02:26:20 |只看作者 |坛友微信交流群
  1. %macro aaa(dsin=,
  2.            vars=,
  3.            invars=,
  4.            keepvars=,
  5.            dsout=);
  6.         %let vars_num=%sysfunc(countw(&vars.,' '));
  7.         %let invars_num=%sysfunc(countw(&invars.,' '));
  8.         %let i_num=%eval(&vars_num/&invars_num);
  9.         %do i=1 %to &vars_num.;
  10.                 %let value&i=%SYSFUNC(SCAN(&vars.,&i,' '));
  11.         %end;
  12.         %do j=1 %to &invars_num.;
  13.                 %let name&j=%SYSFUNC(SCAN(&invars.,&j,' '));
  14.         %end;
  15.         data &dsout.;
  16.                 set        &dsin.;
  17.                 keep &keepvars. &invars;
  18.                 %do i=1 %to &i_num;
  19.                         %do j=1 %to &invars_num;
  20.                                 %let k=%eval(&j+(&i-1)*&invars_num);
  21.                                 &&name&j=&&value&k;
  22.                         %end;
  23.                         output;
  24.                 %end;
  25.         run;
  26. %mend;
复制代码
我根据他的思路写成了宏,输出数据集需要进行处理,删除空值观测,添加format
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 1 + 1 好的意见建议

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

使用道具

藤椅
weitingkoala 发表于 2014-2-20 09:23:30 |只看作者 |坛友微信交流群
我没有用宏,直接用的过程步,我想这个问题的关键是把一个观测拆分成几个观测吧。当然,你要把它改写成宏业是相当简单的啦。希望能解决您的问题。
data aaa1;
set aaa;
keep no a b c;
do;
a=a1;b=b1;c=c1;
output;
end;
do;
a=a2;b=b2;c=c2;
output;
end;
do;
a=a3;b=b3;c=c3;
output;
end;
run;
data aaa1;
set aaa1;
format b b1fmt. c c1fmt.;
if a='' then delete;
run;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 1 + 1 需要用macro实现

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

使用道具

板凳
weitingkoala 发表于 2014-2-20 09:59:25 |只看作者 |坛友微信交流群
为什么不以解决问题为目的呢?我稍微改了下,算是用了宏了吧。
%macro aaa(dsin=aaa,vars=a1 b1 c1 a2 b2 c2 a3 b3 c3,invars=a1 b1 c1,keepvars=no,dsout=aaa1);
data &dsout.;
set &dsin.;
keep &keepvars. a b c;
do;
a=a1;b=b1;c=c1;
output;
end;
do;
a=a2;b=b2;c=c2;
output;
end;
do;
a=a3;b=b3;c=c3;
output;
end;
run;
data &dsout.;
set &dsout.;
format b b1fmt. c c1fmt.;
if a='' then delete;
run;
%mend aaa;
%aaa;
已有 2 人评分经验 论坛币 学术水平 收起 理由
Imasasor + 100 + 4 精彩帖子
dxystata + 50 好的意见建议

总评分: 经验 + 50  论坛币 + 100  学术水平 + 4   查看全部评分

使用道具

报纸
dxystata 发表于 2014-2-20 10:17:12 |只看作者 |坛友微信交流群
weitingkoala 发表于 2014-2-20 09:59
为什么不以解决问题为目的呢?我稍微改了下,算是用了宏了吧。
%macro aaa(dsin=aaa,vars=a1 b1 c1 a2 b2  ...
不通用啊!

使用道具

地板
weitingkoala 发表于 2014-2-20 10:24:10 |只看作者 |坛友微信交流群
dxystata 发表于 2014-2-20 10:17
不通用啊!
好吧

使用道具

7
龙潭丰乐 学生认证  发表于 2014-2-27 20:06:14 |只看作者 |坛友微信交流群
牵你↗左手 发表于 2014-2-20 11:18
我根据他的思路写成了宏,输出数据集需要进行处理,删除空值观测,添加format
请问老师,如何把数据
no a1 b1 c1
1 x1 1 1
1 z1 2 1
1 y1 1 2
2 x2 1 2
2 y2 1 2
3 x3 2 2
变成
1 x1 1 1 z1 2 1 y1 1 2
2 x2 1 2 y2 1 2
3 x3 2 2
我尝试改写你这个宏,但是没有成功!谢谢了

使用道具

8
jzh63 发表于 2014-2-28 04:55:14 |只看作者 |坛友微信交流群
龙潭丰乐 发表于 2014-2-27 20:06
请问老师,如何把数据
no a1 b1 c1
1 x1 1 1
直接用proc transpose, 或者用array 都可以.

使用道具

9
牵你↗左手 发表于 2014-2-28 08:31:43 |只看作者 |坛友微信交流群
龙潭丰乐 发表于 2014-2-27 20:06
请问老师,如何把数据
no a1 b1 c1
1 x1 1 1
  1. data b;
  2.         set a(rename=(a1=a b1=b c1=c));
  3.         by no;
  4.         retain sum a1 b1 c1 a2 b2 c2 a3 b3 c3;
  5.         if first.no then sum=1;
  6.         else sum=sum+1;
  7.         if sum=1 then do;a1=a;b1=b;c1=c;end;
  8.         else if sum=2 then do;a2=a;b2=b;c2=c;end;
  9.         else if sum=3 then do;a3=a;b3=b;c3=c;end;
  10.         if last.no;
  11.         keep no a1 b1 c1 a2 b2 c2 a3 b3 c3;
  12. run;
复制代码
这是我的一个思路,可以改成宏的。
已有 1 人评分论坛币 收起 理由
Still.. + 50 热心帮助其他会员

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

使用道具

10
龙潭丰乐 学生认证  发表于 2014-2-28 16:43:05 |只看作者 |坛友微信交流群
weitingkoala 发表于 2014-2-20 09:23
我没有用宏,直接用的过程步,我想这个问题的关键是把一个观测拆分成几个观测吧。当然,你要把它改写成宏业 ...
可以尝试array来简化你这个代码:
  1. data aaa1;
  2.   set aaa;
  3.   do i=1 to 3;
  4.    array a[3]$ a1-a3;
  5.     array b[3] b1-b3;
  6.          array c[3] c1-c3;
  7.         aa=a(i);
  8.         bb=b(i);
  9.         cc=c(i);
  10.         output;
  11. end;
  12. keep no aa bb cc;
  13. run;
复制代码

使用道具

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

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

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

GMT+8, 2024-5-1 18:40