全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2013-2-21 13:54:47
学习一下, 哈哈
二维码

扫码加我 拉你入群

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

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

2013-2-21 15:33:52
搞不定
二维码

扫码加我 拉你入群

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

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

2013-2-21 16:54:47
学习!
二维码

扫码加我 拉你入群

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

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

2013-2-21 16:56:48
不过好像很难!
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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步。


二维码

扫码加我 拉你入群

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

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

2013-2-21 22:03:41
二维码

扫码加我 拉你入群

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

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

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

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

扫码加我 拉你入群

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

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

2013-2-22 00:48:35
高深了
二维码

扫码加我 拉你入群

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

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

2013-2-22 09:18:50
学习一下
二维码

扫码加我 拉你入群

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

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

2013-2-22 09:37:59
怎么这种征集帖都成了精华了啊
二维码

扫码加我 拉你入群

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

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

2013-2-22 10:02:29
semidefinite 发表于 2013-2-22 09:37
怎么这种征集帖都成了精华了啊
这不是征集贴,这是一个高水平的技术讨论贴,能够代表sas某个特定问题深入的讨论,并且有很多高手进行了详细回答和探讨,作为精华,当之无愧
二维码

扫码加我 拉你入群

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

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

2013-2-22 10:35:15
支持
二维码

扫码加我 拉你入群

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

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

2013-2-22 10:59:46
高手
二维码

扫码加我 拉你入群

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

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

2013-2-22 11:25:23
顶啊 ,求解决
二维码

扫码加我 拉你入群

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

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

2013-2-22 11:50:09
我是来膜拜的
二维码

扫码加我 拉你入群

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

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

2013-2-22 12:02:39
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 ...
二维码

扫码加我 拉你入群

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

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

2013-2-22 12:05:44
bobguy 发表于 2013-2-22 12:02
看不懂啊,能解释一下吗? 问一下,你是个女生?
二维码

扫码加我 拉你入群

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

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

2013-2-22 12:09:29
Try the following code:

data _null_;
a="5+sum(2.1,5.312)";/*a是个字符型变量*/
call symput('t',a);
b=call symget(%unquote(&t));
put b;
run;
二维码

扫码加我 拉你入群

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

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

2013-2-22 12:44:54
data a;
        a="3+sum(1,5)";
        call symput("a",compress(a,'"'));
    b=&a;
        put a= b=;
run;
二维码

扫码加我 拉你入群

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

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

2013-2-22 13:41:29
whiz 发表于 2013-2-22 12:09
Try the following code:

data _null_;
b=call symget(%unquote(&t));

call语句还可以这么用?不行吧?
二维码

扫码加我 拉你入群

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

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

2013-2-22 14:14:22
这个严格来讲 算不算呢?
data ex;
a="exp(1+sum(1,2))";
b=.;
proc iml;
edit ex;
read point 1 var {a};
call symputx('ra',a);
b=&ra;
replace;
quit;
run;
二维码

扫码加我 拉你入群

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

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

2013-2-22 17:09:49
ziyenano 发表于 2013-2-22 14:14
这个严格来讲 算不算呢?
data ex;
a="exp(1+sum(1,2))";
在proc iml执行之前 'data ex‘步已经执行完毕了。

proc iml 所执行的是对已存在数据集的操作。data ex那一步b的值是missing的。

换句话说,最后那个“run;”不是data ex;的边界,'PROC' 才是。
二维码

扫码加我 拉你入群

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

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

2013-2-22 17:16:14
pobel 发表于 2013-2-22 17:09
在proc iml执行之前 'data ex‘步已经执行完毕了。

proc iml 所执行的是对已存在数据集的操作。data  ...
我也是这么觉得的~
二维码

扫码加我 拉你入群

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

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

2013-2-22 18:55:19
不懂,以后得多学学
二维码

扫码加我 拉你入群

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

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

2013-2-22 19:08:16
whiz 发表于 2013-2-22 12:09
Try the following code:

data _null_;
Try the following code:

data _null_;
a="5+sum(2.1,5.312)";/*a是个字符型变量*/
call symput('t',a);
b=call symget(%unquote(&t));
put b;
run;


call不可接变量赋值
symput的宏赋值sas默认data步后run后才进行编译,因此后面的&t解析就是问题
二维码

扫码加我 拉你入群

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

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

2013-2-22 19:11:39
ziyenano 发表于 2013-2-22 14:14
这个严格来讲 算不算呢?
data ex;
a="exp(1+sum(1,2))";
这个严格来讲 算不算呢?
data ex;
a="exp(1+sum(1,2))";
b=.;
proc iml;
edit ex;
read point 1 var {a};
call symputx('ra',a);
b=&ra;
replace;
quit;
run;
----------
SAS编码规范一般要求语句后,不管data步还是proc步,要加个run;来告诉sas完事儿了,可以编译了。
但是如果你不写run;对于不用进行声明退出的,是没什么区别的,因此你只是把run省略了。
二维码

扫码加我 拉你入群

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

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

2013-2-22 19:32:13
kuhasu 发表于 2013-2-22 19:11
这个严格来讲 算不算呢?
data ex;
a="exp(1+sum(1,2))";
嗯,其实是用iml编辑了ex,算不上在一个data步了
二维码

扫码加我 拉你入群

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

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

2013-2-22 23:14:33
zhangzachary 发表于 2013-2-20 17:16
没有达到kuhasu大神的要求,仅仅作为抛砖引玉。
学习下
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群