楼主: kuhasu
17019 100

[问答] SAS水平测试,动脑子一起看看吧,高手入   [推广有奖]

教授VIP

院士

52%

还不是VIP/贵宾

-

威望
5
论坛币
62952 个
通用积分
3.2723
学术水平
59 点
热心指数
85 点
信用等级
43 点
经验
67049 点
帖子
2822
精华
0
在线时间
1670 小时
注册时间
2005-4-30
最后登录
2020-11-10

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
首先这个看起来基础,但是其实不基础。我问过俩SAS技术董事,都没完美搞定。

data _null_;
a="5+sum(2.1,5.312)";/*a是个字符型变量*/
b=  /*让b=5+sum(2.1,5.312),就是a的算式/结果,而不是字符*/;
put b;
run;

要求:
1、必须一个data步内完成;
2、计算完后,b的值得能返回到上面的原data步。
3、计算效率越高越好,最好相当于SAS内部函数调用或者%let宏函数赋值。

我进一步明确一下内容:
data _null_;
m=5;n=2.1;r=5.312;
a="m+sum(n,r)";/*a是个字符型变量*/
b=  /*让b=5+sum(2.1,5.312),就是a的算式/结果,而不是字符*/;
put b;
run;

除了a="m+sum(n,r)";还可能是a="m+sum(n,exp(r))";a="log(m+sum(n,r))";等

二维码

扫码加我 拉你入群

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

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

关键词:水平测试 动脑子 data步 字符型变量 Data 脑子 水平测试

本帖被以下文库推荐

沙发
zhangzachary 发表于 2013-2-20 17:16:15 |只看作者 |坛友微信交流群
  1. data _null_;
  2. a="5+sum(2.1,5.312)";
  3. call execute("data _null_;b="||a||";put b=;run;");
  4. run;
复制代码
没有达到kuhasu大神的要求,仅仅作为抛砖引玉。
已有 1 人评分经验 收起 理由
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 100   查看全部评分

寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

使用道具

藤椅
hamsik11 发表于 2013-2-20 17:26:10 |只看作者 |坛友微信交流群
zhangzachary 发表于 2013-2-20 17:16
没有达到kuhasu大神的要求,仅仅作为抛砖引玉。
为啥不能
data _null_;
call execute("data _null_;b="||"5+sum(2.1,5.312)"||";put b=;run;");
run;
?

使用道具

板凳
kuhasu 发表于 2013-2-20 17:28:03 |只看作者 |坛友微信交流群
hamsik11 发表于 2013-2-20 17:26
为啥不能
data _null_;
call execute("data _null_;b="||"5+sum(2.1,5.312)"||";put b=;run;");
b得返回原data步啊~这个b是在另一个data 步。呵呵
call execute是在data步run后运行
fcmp效率相当低,有个runmacro函数
include宏也是在run;后才执行
已有 1 人评分经验 收起 理由
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 100   查看全部评分

使用道具

报纸
respringwa 发表于 2013-2-20 17:53:23 |只看作者 |坛友微信交流群
学习下

使用道具

地板
Mizuhotina 发表于 2013-2-20 18:13:52 |只看作者 |坛友微信交流群

使用道具

7
hamsik11 发表于 2013-2-20 18:36:41 |只看作者 |坛友微信交流群
kuhasu 发表于 2013-2-20 17:28
b得返回原data步啊~这个b是在另一个data 步。呵呵
call execute是在data步run后运行
fcmp效率相当低 ...
摁 fcmp我都没用过,macros基本上可以解决问题了.试了一下这个,还得想想怎么达到你的要求...

%let a="5+sum(2.1,5.312)";
data _null_;
b=resolve(%sysfunc(DEQUOTE(&a)));
put b;
run;
已有 1 人评分经验 收起 理由
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 100   查看全部评分

使用道具

8
linc87 发表于 2013-2-20 19:13:39 |只看作者 |坛友微信交流群
这个帖子成精华了?

使用道具

9
kuhasu 发表于 2013-2-20 19:15:07 |只看作者 |坛友微信交流群
hamsik11 发表于 2013-2-20 18:36
摁 fcmp我都没用过,macros基本上可以解决问题了.试了一下这个,还得想想怎么达到你的要求...

%let a= ...
a="5+sum(2.1,5.312)"
没在data步里

使用道具

10
Imasasor 发表于 2013-2-20 19:22:24 |只看作者 |坛友微信交流群
data a(drop=y);
a="5+sum(2.1,5.312)";
%global hello2;
%macro mac;
%let hello1=%sysfunc(tranwrd(&hello,sum,%nrstr(%sysfunc%(sum))));
%let hello2=%sysevalf(&hello1);
%mend;
call symput("hello",a);
y="hello2";
call execute('%mac');
b=symgetn(y);
put b;
run;

问题是解决了,但是有一些局限性,未能在宏函数运算中直接求得表达式的值,不知道有什么方法可以直接求出
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

使用道具

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

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

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

GMT+8, 2024-4-19 23:24