楼主: 小鳄鱼a
7919 12

请问如何将字符型宏变量转化为数值型 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2014-10-28 22:21:24 |AI写论文
20论坛币
谢谢   

最佳答案

sniperhgy 查看完整内容

o(∩_∩)o ,没有必要贴那么多,只需要把rc的出处搞出来就行了和楼主的区别,将%local改成%global,原因的话,就是因为%local的宏变量,只能存活于定义的宏内,在%almktscore里面调用%checkvar,一旦checkvar执行完毕,rc就挂了……,但是改成global,rc就可以保存下来,哪怕最后用%symdel把它删除也是可以的。 还有,楼主既然使用了symputx,连%global都可以不写,直接 其中G代表了Global,也可以'L'意义的话,请猜一下,猜 ...
关键词:数值型 字符型 如何
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
rj12 + 1 + 1 + 1 精彩帖子

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

沙发
sniperhgy 发表于 2014-10-28 22:21:25
小鳄鱼a 发表于 2014-10-29 13:47
%macro checkvar(dsn=, var=);
   options nonotes;
   ***Note: 0---not found :: 1---found;
o(∩_∩)o ,没有必要贴那么多,只需要把rc的出处搞出来就行了
  1. data test;
  2.   input a $;
  3.   cards;
  4. 1
  5. a
  6. ;
  7. run;

  8. %macro checkvar(dsn =, var =);
  9.    options nonotes;
  10.    ***Note: 0---not found :: 1---found;
  11.     proc contents
  12.       noprint
  13.       data = &dsn
  14.       out = _name_(keep = name);
  15.     run;

  16.     %global rc;
  17.     %let rc = 0;

  18.     data _null_;
  19.       set _name_;
  20.       call symputx('rc', '1');
  21.       where upcase(name) = "%upcase(&var)";
  22.     run;

  23.     %put rc = &rc;
  24. %mend;

  25. %macro test(var);
  26.   %checkvar(dsn = a, var = &var.)
  27.   %put &rc.;
  28. %mend;

  29. %test(a)
  30. %test(b)
复制代码
和楼主的区别,将%local改成%global,原因的话,就是因为%local的宏变量,只能存活于定义的宏内,在%almktscore里面调用%checkvar,一旦checkvar执行完毕,rc就挂了……,但是改成global,rc就可以保存下来,哪怕最后用%symdel把它删除也是可以的。
还有,楼主既然使用了symputx,连%global都可以不写,直接
  1.   call symput('rc', '1', 'G')
复制代码

其中G代表了Global,也可以'L'意义的话,请猜一下,猜对了我就告诉你
已有 1 人评分论坛币 收起 理由
admin_kefu + 50 根据规定进行奖励

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

藤椅
小鳄鱼a 发表于 2014-10-28 23:00:40
WARNING: 没有解析符号引用 RC。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &rc=1
ERROR: 宏 ALMKTSCORE 将终止执行。

板凳
小鳄鱼a 发表于 2014-10-28 23:10:37
%if &rc=1 %then %do;
                                                         data almktscore;
                                                         merge almktscore &Ndat.3;
                                                         by stkcd year ym;
                                                         run;
                                                         %end;
                             %else %do;
                                                         data almktscore;
                                                         merge almktscore &Ndat.3;
                                                         by stkcd year ;
                                                         run;
                                                         %end;

报纸
小鳄鱼a 发表于 2014-10-28 23:13:47
或者是因为其他问题,而不是宏变量类型的问题

地板
heguima 发表于 2014-10-29 08:52:05
你的&Ndat.3是什么东西?数据集?把小数点去掉,数据集不要这样命名,你可以改成Ndat_3,但感觉不像是这里错

7
sniperhgy 发表于 2014-10-29 10:41:33
小鳄鱼a 发表于 2014-10-28 23:10
%if &rc=1 %then %do;
                                                         data almktscore;
                                                         merge almktscore &Ndat.3;
楼主你好,我来了。
请问那个rc是在哪里生成的?还是贴出完整的语句让大家看一下。那个错误的提示是因为rc没有被解析,所以&rc被当成了字符串,至于说转类型,不需要的,%if后面的比较符号会根据比较数的类型自动转换类型的。

8
sniperhgy 发表于 2014-10-29 10:43:35
heguima 发表于 2014-10-29 08:52
你的&Ndat.3是什么东西?数据集?把小数点去掉,数据集不要这样命名,你可以改成Ndat_3,但感觉不像是这里错 ...
楼主你好,&Ndat.3里的那个点代表了Ndat宏变量解析的结束,如果不加的话,SAS会把Ndat3整个当成一个宏变量,但是楼主的意图貌似是Ndat是宏变量,所以那个点是必要的。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 4 + 4 + 4 精彩帖子

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

9
小鳄鱼a 发表于 2014-10-29 13:47:12
sniperhgy 发表于 2014-10-29 10:43
楼主你好,&Ndat.3里的那个点代表了Ndat宏变量解析的结束,如果不加的话,SAS会把Ndat3整个当成一个宏变量 ...
%put data=&Ndat.3;
%checkvar(dsn=&Ndat.3, var=ym);
proc sort data=&Ndat.3 ;by stkcd year ym;run;
                                %if &i=1 %then %do;
                                data  almktscore; set &Ndat.3; run;
                                %end;
                                %else %do;


                                                        %if &rc=1 %then %do;
                                                         data almktscore;
                                                         merge almktscore &Ndat.3;
                                                         by stkcd year ym;
                                                         run;
                                                         %end;
                             %else %do;
                                                         data almktscore;
                                                         merge almktscore &Ndat.3;
                                                         by stkcd year ;
                                                         run;
                                                         %end;
                                %end;




10
小鳄鱼a 发表于 2014-10-29 14:47:14
sniperhgy 发表于 2014-10-29 10:43
楼主你好,&Ndat.3里的那个点代表了Ndat宏变量解析的结束,如果不加的话,SAS会把Ndat3整个当成一个宏变量 ...
能说拒绝被调戏吗

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 22:25