楼主: 邢不行
3777 5

一个关于宏参数的问题 [推广有奖]

院士

5%

还不是VIP/贵宾

-

威望
1
论坛币
26743 个
通用积分
149.2294
学术水平
485 点
热心指数
505 点
信用等级
456 点
经验
44525 点
帖子
547
精华
26
在线时间
1112 小时
注册时间
2010-4-30
最后登录
2024-5-27

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
  1. %macro heng(all,x);
  2.         %do i=1 %to &all;
  3.                 var&i=var&i*&x;
  4.         %end;
  5. %mend;
  6. data wang.cov1;
  7.         set wang.cov nobs=all;
  8.         %heng(all,x);
  9. run;
复制代码


程序中的cov数据集在附件中有截图,名字为cov.png

我程序的目的是希望对于cov数据集得每一行观测中的所有var开头的变量都乘以该观测的x,比如var1=var1*x。输出结果截图也在附件中,名字为结果.png
由于对于cov中的var的数目并不知道,故用宏变量来做。

但是上述程序运行出来有问题,
log显示为:
1356  data wang.cov1;
1357      set wang.cov nobs=all;
1358      %heng(all,x);
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &zongshu
ERROR: %TO 值(%DO I 循环中)无效。
ERROR: 宏 HENG 将终止执行。


当我把上述程序中的%heng(all,x);语句改为%heng(2,x);时,就可以运行得到正确结果,(对于例子中的数据all=2)
请问这是为什么啊...应该如何解决啊 谢谢了!
二维码

扫码加我 拉你入群

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

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

关键词:Error Macro Wang Data nobs 参数

cov.png (4.77 KB)

cov.png

结果.png (5.06 KB)

结果.png

不管去哪里 只要在路上
沙发
baoaibaobao 发表于 2011-3-31 08:17:36 |只看作者 |坛友微信交流群
楼主,先只看你的代码,你的问题出在
  1. data wang.cov1;
  2.         set wang.cov nobs=all;
  3.         %heng(all,x);
  4. run;
复制代码
这段代码中,all在%heng(all,x) 中是不能直接引用的,我给你改了一下,测试通过。
修改如下:
  1. data b;
  2.    set a nobs=all end=last;
  3.    if last then call symput('all',all);
  4. run;
  5. data b;
  6.         set a;
  7.         %heng(&all,x);
  8. run;
复制代码
其次,你这段代码的思路我觉得不是太对,你的目的是要将以var开头的变量全部乘以x,那你为什么要用观测例数all呢,你将观测增加到3个,就会发现生成的数据集中var3是缺失的。其实用数组就挺简单的。
  1. data a;
  2. input variable$ var1 var2 x;
  3. drop variable;
  4. cards;
  5. var1 23 45 0.5
  6. var2 12 45 0.5
  7. var3 23 89 0.5
  8. var4 3 4 0.5
  9. ;
  10. data b;
  11. set a;
  12. array v(*) var: ;
  13.         do i=1 to dim(v);
  14.                 v(i)=v(i)*x;
  15.         end;
  16. drop i;
  17. run;
复制代码
以上酌情参考!
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
hssnow + 1 + 1 + 1 精彩帖子
论坛数据分析 + 100 好的意见建议

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

使用道具

藤椅
leedx 发表于 2011-3-31 10:17:44 |只看作者 |坛友微信交流群
LZ上的程序学习了~

使用道具

板凳
邢不行 在职认证  发表于 2011-4-1 18:29:56 |只看作者 |坛友微信交流群
2# baoaibaobao
首先非常感谢您的回答,帮我解决了问题。经常看到你在论坛中帮别人解决问题,深表敬佩!

其次你问的那个为什么不用数组的问题,我来解释下。

原始数据cov中的观测数是一定会等于var开头变量的个数的,所以我用all来确定var开头的变量的个数不会有问题。

大哥您自己贴的程序很巧妙,学到很多,但是如果把你程序中那句drop variable;去掉的话程序运行就会出现问题,会出现如下的error
148  data b;
149  set a;
150  array v(*) var: ;
ERROR: 数组列表中的所有变量必须是相同的类型,如,都是数值型或字符型。
ERROR: 数组列表中的所有变量必须是相同的类型,如,都是数值型或字符型。

能解释下为什么嘛?
不管去哪里 只要在路上

使用道具

报纸
baoaibaobao 发表于 2011-4-1 18:32:58 |只看作者 |坛友微信交流群
4# 邢不行
array v(*) var: ;
这个语句表示的将var开头的所有变量作为数组v,因为variable是个字符变量,如果不删除,是会出错的!

使用道具

地板
邢不行 在职认证  发表于 2011-4-1 19:52:08 |只看作者 |坛友微信交流群
5# baoaibaobao

受教了! 谢谢!
不管去哪里 只要在路上

使用道具

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

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

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

GMT+8, 2024-6-17 14:39