楼主: kuhasu
19468 100

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

31
axe2004 发表于 2013-2-21 13:54:47
学习一下, 哈哈

32
无诺 发表于 2013-2-21 15:33:52
搞不定

33
B.N.F 发表于 2013-2-21 16:54:47
学习!

34
B.N.F 发表于 2013-2-21 16:56:48
不过好像很难!

35
kuhasu 发表于 2013-2-21 17:12:09
bobguy 发表于 2013-2-21 07:46
You can wrap it up into a string with macro functions embedded and use resolve to solve it in the sa ...
要是a="5+sum(2.1,exp(5.312))";呢

搜索所有函数,然后加%sysfunc吗

You can wrap it up into a string with macro functions embedded and use resolve to solve it in the same step.


data tmp;
a="5+sum(2.1,5.312)";
astr=catt('%sysevalf(', scan(a,1,'+'),'+%sysfunc(',scan(a,2,'+'),'))');
call symputx('avalue',astr);
b=input(resolve('&avalue'),best.);
put a b;
run;

36
kuhasu 发表于 2013-2-21 17:12:38
soporaeternus 发表于 2013-2-21 11:22
我的理解是K神的意思是那串b是已经存在的一组函数,然后在一个data步里计算出这些函数的返回值。所以我认 ...
借助宏,fcmp,自定义函数dll都行~
是的,公式有可能出来任何情况的
本质上就是计算字符型变量的公式,可是sas是没有现成的函数的。没法有一个函数可以直接告诉他那是个公式,算去吧
--------------------------------------------------------------
你的方法跟我第一种方法类似,都是想能过宏运算计算得到宏变量的值,可是这不是楼主想要的,因为如果有多个sum,如果有其它运算符号,程序还得重写,楼主想要的还是在data步直接计算出值。

37
pobel 在职认证  发表于 2013-2-21 20:15:25
以下纯属个人推断,还请各位高手指教。

楼主所指的情况应该是这样的:
data _null_;
      a="某个算式";
     b= sas对算式进行运算并返回结果;
run;

如果在这个data步运行完之后,不允许SAS运行其他代码的话(如call execute产生的代码),这种情况应该是不能实现的。
1.

这似乎和data步的运行机制有些冲突。SAS在运行一个data步之前,需要通过编译来确定构成整个data步的语句是什么,并进行语法判断。如果编译过程中遇到宏或宏变量的引用,SAS会将宏或宏变量的解析结果作为data步的一部分。然而这也是在data步执行之前,而不能实现在执行过程中动态地改变代码。

2.
既然data步解析过程不能将变量的值另外作为SAS执行代码的一部分,剩下的可能就是通过在data步执行过程中,动态的根据变量的值生成宏变量,或者从宏变量里取值。但从宏变量里传过来的值是字符形式的,如果这个字符串能直接转化成数值,则可以通过input来实现;否则这个值也只能存到字符型变量里了。

这个例子中,传给宏变量的值是字符型的算式,而只有将这个算式的结果通过宏变量传回给data步的某个变量时,楼主的要求才能实现。若要实现这样的运算,似乎只能用%sysevalf()和%sysfunc()。然后再将运算结果input成数值型。不过这是宏语言,而不是SAS语句所执行的。

3.

用call execute() 和宏的话应该都不会将b的值返回到原来的data步。


已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 观点有启发
a6566792 + 1 + 1 + 1 分析的有道理
Imasasor + 100 + 100 + 3 + 4 + 2 分析的有道理

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

和谐拯救危机

38
chc349 发表于 2013-2-21 22:03:41

39
kuhasu 发表于 2013-2-21 22:13:52
pobel 发表于 2013-2-21 20:15
以下纯属个人推断,还请各位高手指教。

楼主所指的情况应该是这样的:
可以采取任何方式。
目前看基本是无任何直接的函数可以实现,而如果采取自定义函数,那么不管是fcmp还是dll直接c语言调用,效率方面还有待考量。
另一种思路是利用fcmp的runmacro函数在一个proc fcmp内调用宏并返回,其他宏的方法暂时没想到。好像很困难。
也就是说,自定义函数来解析a,或者利用宏返回a是两个思路。
另外还有个效率问题。所以请多多动脑筋,看看还有什么方法或者可能快读的方式没有。
而sysevalf和sysfunc对于带有函数和变量的算式,支持的函数也是有限和有条件的。
总之是非常非常有技巧的一个事情。

40
BBer-Chen 在职认证  发表于 2013-2-22 00:48:35
高深了

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

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