楼主: kuhasu
17064 100

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

71
yatming 发表于 2013-2-27 11:35:15 |只看作者 |坛友微信交流群
Although STRPARSER is too obtuse. Please have a try.
  1. proc fcmp outlib=work.funcs.test;
  2.     function strparser(expression $) $ 100;
  3.         length x y $100;
  4.         x = ''; y = ''; m = 0; n = 0;
  5.         l = length(expression);
  6.         do i = 1 to l;
  7.             b = substr(expression, i, 1);
  8.             if prxmatch('/[a-z]/', b) then do;
  9.                 y = cats(y, b);
  10.             end;
  11.             else if b='(' then do;
  12.                 if y ne '' then do;
  13.                     y = cats('%sysfunc(', cats(y, b));
  14.                     x = cats(x, y);
  15.                     y = '';
  16.                     m = m+1;
  17.                 end ;
  18.                 n = n + 1;
  19.             end;
  20.             else if b = ')' then do;
  21.                 n = n - 1;
  22.                 if m = n+1 then do;
  23.                     x = cats(x, cats(cats(ifc(y='','',cats('&',y)),b),')'));
  24.                     y = '';
  25.                     m = m - 1;
  26.                 end;
  27.             end;
  28.             else do;
  29.                 x = cats(x, cats(ifc(y='','',cats('&',y)),b));
  30.                 y='';
  31.             end;
  32.         end;
  33.         x = cats(x, ifc(y='','',cats('&',y)));
  34.         return (x);
  35.     endsub;
  36. run;

  37. options cmplib=work.funcs;

  38. data _null_;
  39.     length x $ 1000;
  40.     input a b c d t:$100.;
  41.     array y _numeric_;
  42.     do over y;
  43.         call symput(lowcase(vname(y)),y);
  44.     end;
  45.     x = cats('%sysevalf(',strparser(compress(lowcase(t))),')');
  46.     call symput('formula', x);
  47.     result = input(resolve('&formula'),best.);
  48.     put result;
  49.     cards;
  50.     1 2 3 4 a+cos(sum(c,exp(d+log(b))))
  51.     10 15 20 25 sin(a)+cos(sum(b,exp(c+log(d))))
  52.     5 6 7 8 b/d
  53. ;
  54. run;
复制代码
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
kuhasu + 5 + 5 + 5 精彩帖子
紫血丹心 + 1 + 1 + 1 分析的有道理
Imasasor + 100 + 100 + 3 看起来很牛,虽然哥看不懂

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

使用道具

72
yxcc1070 发表于 2013-2-27 17:08:51 |只看作者 |坛友微信交流群
Mark

使用道具

73
yxcc1070 发表于 2013-2-27 17:28:40 |只看作者 |坛友微信交流群
  1. data test;
  2.         m=5;
  3.         n=2.1;
  4.         r=5.312;
  5.         a="m+sum(n,r)";
  6.         call symput ("ma",a);
  7.         call execute('%nrstr(data _null; set test; b=&ma; put b=;run;)');
  8. run;
复制代码
这样算不? 不知道这种在楼主的定义里算不算一个data step.

使用道具

74
Jackywolf_2008 发表于 2013-2-27 23:59:23 |只看作者 |坛友微信交流群
fcmp对于这个问题来说,效率不是问题,楼主多虑了

使用道具

75
kuhasu 发表于 2013-2-28 01:07:36 |只看作者 |坛友微信交流群
yxcc1070 发表于 2013-2-27 17:28
这样算不? 不知道这种在楼主的定义里算不算一个data step.
b没有返回原data步

使用道具

76
kuhasu 发表于 2013-2-28 01:09:07 |只看作者 |坛友微信交流群
Jackywolf_2008 发表于 2013-2-27 23:59
fcmp对于这个问题来说,效率不是问题,楼主多虑了
效率提高后的fcmp sas93是有一定提高,但是对于基础性计算,效率损失严重,每秒只能3000多次
应该有什么样的效率和处理方法呢?

使用道具

77
xjflike 发表于 2013-2-28 08:16:09 |只看作者 |坛友微信交流群
学习了!

使用道具

78
yxcc1070 发表于 2013-2-28 20:37:00 |只看作者 |坛友微信交流群
提供个思路,试着用vvalue这个函数。
  1. data test;
  2.         m=5;
  3.         n=2.1;
  4.         r=5.312;
  5.         a="m+sum(n,r)";
  6.         b=vvalue(m)+sum(vvalue(n),vvalue(r));
  7.         put b=;
  8. run;
复制代码
就是不知道如何判定哪些word是变量,哪些是函数。所以不能满足要求。SAS内部不知道是如何处理的,难道是扫描一系列Reserved keywords?如果有类似的函数来判定的话,就可以完成任务。

使用道具

79
Jackywolf_2008 发表于 2013-2-28 23:11:37 |只看作者 |坛友微信交流群
kuhasu 发表于 2013-2-28 01:09
效率提高后的fcmp sas93是有一定提高,但是对于基础性计算,效率损失严重,每秒只能3000多次
应该有什么 ...
从编程角度来讲,目前我个人倾向于使用fcmp, 暂时也想不到更好的方法。至于计算性能,不知道期望值是多少,而且个人觉得性能的好坏不仅依赖于软件,硬件是需要考量,因此,我觉得SAS DS2和SAS HPA的结合应该可以达到你的期望。
另外,我不太明白楼主为什么要这么做?什么样的商业实践需要这样做?

使用道具

80
kuhasu 发表于 2013-3-3 00:41:10 |只看作者 |坛友微信交流群
yatming 发表于 2013-2-27 11:35
Although STRPARSER is too obtuse. Please have a try.
very cool solution.
变量进行了宏变量处理。以前从来没看到这种解决方法。
一般都是进行宏,然后temp array来保持高效率

使用道具

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

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

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

GMT+8, 2024-5-3 02:10