楼主: kuhasu
19469 100

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

91
kuhasu 发表于 2013-7-16 21:30:29
zhengbo8 发表于 2013-6-19 16:25
正则表达式匹配出数值后再操作。
正则表达式?

92
蓝水澈 发表于 2013-7-19 15:51:14
我是新手,想要学习SAS,刚从图书馆借了几本书回来,却发现书上的SAS版本是9.1.2和v8.2,而且还必须在xp或者vista环境下运行,我的是win7 64位。想问大侠们9.3版本和以上的9.1.2和v8.2有什么区别?若我用9.1.2版本的书来自学可以么(因为图书馆关门了,所以暂时只能用这2个版本的书)

93
jingju11 发表于 2013-7-20 11:55:56
kuhasu 发表于 2013-7-16 21:30
正则表达式?
这个问题,按照你自己提出的思路RUN_MACRO in FCMP,也就是五六行的程序。
京剧

94
boe 发表于 2013-7-20 12:11:42
神的境界是不知道1+1等于几
Gorgeous girl , I love !

95
kuhasu 发表于 2013-7-26 20:26:12
jingju11 发表于 2013-7-20 11:55
这个问题,按照你自己提出的思路RUN_MACRO in FCMP,也就是五六行的程序。
京剧
几年前大胖猫给了段run macro的,五六行搞不定,你试试看
最新的dosubl()搞出来的也奖励1000好了。

96
kuhasu 发表于 2013-7-26 20:26:45
boe 发表于 2013-7-20 12:11
神的境界是不知道1+1等于几
a bug of sas

97
levinjiang 发表于 2013-7-26 23:25:36
yatming 发表于 2013-2-27 11:35
Although STRPARSER is too obtuse. Please have a try.
你的代码有点小缺陷
当括号是用于计算,而不是用于函数时,你的代码会出现问题
如(a+b)**c这种形式,我这边测试结果好像不对
我在你的基础上,添加了一点,使得它可以处理上述形式的算式了
  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
  9.             do;*1;
  10.                 y = cats(y, b);
  11.             end;*1;
  12.             else if b='(' then do;*3;
  13.                 if y ne '' then do;*2;
  14.                     y = cats('%sysfunc(', cats(y, b));
  15.                     x = cats(x, y);
  16.                     y = '';
  17.                     m = m+1;
  18.                 end ;*2;
  19.                                 else do ;
  20.                  y = cats('%eval(', cats(y, b));
  21.                     x = cats(x, y);
  22.                     y = '';
  23.                     m = m+1;
  24.                                         end;
  25.                 n = n + 1;
  26.             end;*3;
  27.             else if b = ')' then do;*5;
  28.                 n = n - 1;
  29.                 if m = n+1 then do;*4;
  30.                     x = cats(x, cats(cats(ifc(y='','',cats('&',y)),b),')'));
  31.                     y = '';
  32.                     m = m - 1;
  33.                 end;*4;
  34.             end;*5;
  35.             else do;*6;
  36.                 x = cats(x, cats(ifc(y='','',cats('&',y)),b));
  37.                 y='';
  38.             end;*6;
  39.         end;
  40.         x = cats(x, ifc(y='','',cats('&',y)));
  41.         return (x);
  42.     endsub;
  43. run;

  44. options cmplib=work.funcs;

  45. data _null_;
  46.     length x $ 1000;
  47.     input a b c d t:$100.;
  48.     array y _numeric_;
  49.     do over y;
  50.         call symput(lowcase(vname(y)),y);
  51.     end;
  52.     x = cats('%sysevalf(',strparser(compress(lowcase(t))),')');
  53.     call symput('formula', x);
  54.     result = input(resolve('&formula'),best.);
  55.     put result;
  56.     cards;
  57.     1 2 3 4 a+cos(sum(c,exp(d+log(b))))
  58.     10 15 20 25 sin(a)+cos(sum(b,exp(c+log(d))))
  59.     5 6 7 8 b/d
  60.         1 2 3 4 a*cos(b)
  61.         1 2 3 4 c*(a+b)**c
  62. ;
  63. run;
  64. data tmp;
  65.   a=(1+2)**3;
  66.   put a;
  67. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
kuhasu + 5 + 5 + 5 精彩帖子

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

98
kuhasu 发表于 2013-7-27 13:13:39
蓝水澈 发表于 2013-7-19 15:51
我是新手,想要学习SAS,刚从图书馆借了几本书回来,却发现书上的SAS版本是9.1.2和v8.2,而且还必须在xp或者 ...
没什么问题。教材一般不涉及新版本更新取消/变化的函数和功能,都是比较基础的。

99
kuhasu 发表于 2013-7-28 01:31:46
有论坛币送!

100
jingju11 发表于 2013-7-29 02:48:30
kuhasu 发表于 2013-7-26 20:26
几年前大胖猫给了段run macro的,五六行搞不定,你试试看
最新的dosubl()搞出来的也奖励1000好了 ...
不好意思.自己作了测试,虽然程序短些,但是效率太差,不好意思现丑:
大概是:
data _null_; call symputx('y', %sysfunc(dequote(x))); run;
把这个放到宏里,然后利用
PROC FCMP; RC =RAN_MACRO(...);
我把程序检验了以下,运行一个F =SIN(COS(SUM(1,2,3)**2+1)); 10万次,需要6S,但是直接运行原方程,只需要大概1S.
京剧

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

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