楼主: revelc
9982 20

[问答] 求解call symput 应用 [推广有奖]

11
revelc 发表于 2010-12-28 11:24:55 |只看作者 |坛友微信交流群
8# soporaeternus

谢谢你!如果需要利用的变量每一行都一样就好办了,我这个计算需要每行用到的变量都不同,所以。。。
确实,如果在data步内部用宏的话,解析后只对最后一行或者指定的某行执行一次。请问你提到的call execute 是列外是怎么一回事呢?

使用道具

12
soporaeternus 发表于 2010-12-28 11:46:28 |只看作者 |坛友微信交流群
call execute可以编辑SAS代码本身,并且在data步结束后执行
如果每一行的运算变量的规则可以表格化,那么利用array,或者是call execute可以实现你的需求......
Let them be hard, but never unjust

使用道具

13
elek.me 发表于 2010-12-28 16:01:03 |只看作者 |坛友微信交流群
9# revelc 要用这种方法的话,一般是生成很多个宏变量,然后再另外的data或者proc步里来调用。
生成多个宏变量,可以通过array和call symput来结合使用。
楼主,你最好举个具体的例子。
我的博客: http://elek.me/sas
联系我: http://about.me/elek

使用道具

14
revelc 发表于 2010-12-28 17:57:58 |只看作者 |坛友微信交流群
12# elek.me

id v1 v2v3
v4
v5
d1
d2
var
1 1 2 3 45
v2v4

2
4
3
2
1
5
v1
v4

3 2 5 1 43
v1v3

4 3 1 4 25
v2v5


谢谢你的回复啊,具体的例子大概如上表: 目标是计算方差var,第一行var=std(of v2-v4),第二行var=std(of v1-v4)...。
我试了下用array放在std里,似乎不认。。。

使用道具

15
soporaeternus 发表于 2010-12-28 22:37:58 |只看作者 |坛友微信交流群
  1. data a;
  2.         input id v1 v2 v3 v4 v5 d1 $ d2 $;
  3.         datalines;
  4.         1 1 2 3 4 5 v1 v3
  5.         2 6 7 8 9 10 v2 v4
  6.         3 11 12 13 14 15 v3 v4
  7.         ;
  8. run;

  9. data _null_;
  10.         if _n_=1 then do;
  11.                 call execute("data b;set a;n+1;select (n);");
  12.         end;
  13.         set a end=eof;
  14.         n+1;
  15.         call execute(compress("when ("||n||")")||" var=std(of "||compress(d1||"-"||d2)||");");
  16.         if eof then do;
  17.                 call execute("otherwise;end;drop n;run;");
  18.         end;
  19. run;
复制代码
权当抛砖引玉......
Let them be hard, but never unjust

使用道具

16
baoaibaobao 发表于 2010-12-29 08:41:45 |只看作者 |坛友微信交流群
学习了

使用道具

17
revelc 发表于 2010-12-29 11:01:39 |只看作者 |坛友微信交流群
多谢soporaeternus和各位高手的指点和讨论!拜读两页code中...

使用道具

18
Isscaliu 发表于 2010-12-29 16:11:39 |只看作者 |坛友微信交流群
用proc sql 的select into创建macro variables 然后跑loop行么??
It was the best of times, it was the worst of times.

使用道具

19
revelc 发表于 2011-1-2 10:56:47 |只看作者 |坛友微信交流群
18# Isscaliu

也行 但是不知道哪个效率更高点

使用道具

20
Isscaliu 发表于 2011-1-2 19:31:53 |只看作者 |坛友微信交流群
讲到效率那就要看你的data set是在server里运行还是local运行。还有你的application是什么。当然如果是直接从数据库里边调用data table的话,data step可能没有那么高效率!但是如果从programming效率来讲,你的这个application用call execute可能比较高效(这里用上“可能”,因为俺以前没有接触过call execute,所以没有什么资格直接评论)。但是俺工作现在的application用select into就显得比较有效率。(有一大的data set A,约超过5百万个数据。另一小的data set B,包含reprot 名称和相应的selection criteria。用B的每一行数据在A里边寻找对应数据并产生report。所以在这里我想到的只能用proc sql select into来完成。如有更加高效的方法,请大家指教指教)
It was the best of times, it was the worst of times.

使用道具

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

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

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

GMT+8, 2024-5-14 00:21