楼主: revelc
9955 20

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

  • 0关注
  • 0粉丝

本科生

76%

还不是VIP/贵宾

-

威望
0
论坛币
4 个
通用积分
0.0006
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2608 点
帖子
102
精华
0
在线时间
101 小时
注册时间
2005-11-22
最后登录
2018-7-3

15论坛币
call symputx 似乎只能提取data步的最后一行某变量的值,有没有办法让他对每一行的某变量的值进行提取,比如说如何实现如下代码:

data b;
set a;
call symputx("d1",trim(d1));
call symputx("d2",trim(d2));
variance=std(of &d1-&d2);
run;

如何让call symputx在每一行都停留并提取改行变量d1和d2的值?请各位指点迷津啊!
顺带弱问一句,宏变量的值能不能随表中某变量的值变化呢?

最佳答案

soporaeternus 查看完整内容

我不会写of var list里的数组,只能这样了,希望高手指教,这个效率要高于昨天晚上那个,呵呵
关键词:symput call put variance varian 应用 求解 call symput

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-12-26 20:21:35 |只看作者 |坛友微信交流群
  1. data c;
  2.         retain avg;
  3.         set a;
  4.         array v v1-v5;
  5.         avg=0;
  6.         sum=0;
  7.         stt=input(compress(d1,,'dk'),8.);
  8.         end=input(compress(d2,,'dk'),8.);
  9.         do i=1 to 2*(end-stt+1) by 1;
  10.                 if i<=end-stt+1 then do;
  11.                         sum+v[stt-1+i];
  12.                         if i=end-stt+1 then do;
  13.                                 avg=sum/(end-stt+1);
  14.                                 sum=0;
  15.                         end;
  16.                 end;
  17.                 else if i>end-stt+1 then do;
  18.                         sum+(v[stt-1+i-(end-stt+1)]-avg)**2;
  19.                         if i=2*(end-stt+1) then std=(sum/(end-stt))**(1/2);
  20.                 end;
  21.         end;
  22.         drop sum avg i stt end;
  23. run;
复制代码
我不会写of var list里的数组,只能这样了,希望高手指教,这个效率要高于昨天晚上那个,呵呵
Let them be hard, but never unjust

使用道具

藤椅
soporaeternus 发表于 2010-12-26 21:50:20 |只看作者 |坛友微信交流群
论坛里有位前辈说过,如果用到宏变量需要按行即时更新取值,那么就需要考虑这个宏变量使用的必要性。(大致意思)
我想这可以解决楼主的困惑。
楼主列举代码可能会由于宏变量需要首先compile而报错(&d1 &d2之前不存在而由该步建立)。
call symputx可以在dataset的任何一行,多行赋任意变量的值给宏变量,就是增加对于行数或者是对应变量取值的限制。例如if _n_=10 then call symputx(......);或者是if gender='M' then call symputx(......);
Let them be hard, but never unjust

使用道具

板凳
revelc 发表于 2010-12-27 11:09:26 |只看作者 |坛友微信交流群
2# soporaeternus

多谢楼上的回答。难道说要让macro的值是变化这种想法是不可取的?call symput 直接加条件限制也没效果。看来还得继续加深学习了。

使用道具

报纸
baoaibaobao 发表于 2010-12-27 14:03:44 |只看作者 |坛友微信交流群
还是没明白应该如何解决!!

使用道具

地板
elek.me 发表于 2010-12-27 20:50:24 |只看作者 |坛友微信交流群
楼主的想法,可以实现,不过如果对每一行某变量来赋值给宏变量的话,那么肯定是要生成多个宏变量了,如:
  1. data _null_;
  2.         set sashelp.class;
  3.         call symputx ("weight_"||strip(put(_n_,best.)),weight);
  4. run;
复制代码
这段程序是把sashelp.class里的weight值赋值给宏变量weight_1  weight_2 .... 等等。  1  2 对应的是观测的行数。
我的博客: http://elek.me/sas
联系我: http://about.me/elek

使用道具

7
elek.me 发表于 2010-12-27 20:51:52 |只看作者 |坛友微信交流群
上面是取一个变量值的方法,楼主也可以按照上面的方法尝试一下多个变量的值。 也是可以的。
我的博客: http://elek.me/sas
联系我: http://about.me/elek

使用道具

8
baoaibaobao 发表于 2010-12-28 09:07:04 |只看作者 |坛友微信交流群
再请教一下楼上,那要用的时候该怎么用呢?&weight_1,&weight_2..........??

使用道具

9
soporaeternus 发表于 2010-12-28 11:16:37 |只看作者 |坛友微信交流群
我觉得楼主的想法不需要宏就可以实现,直接在data步里用变量来做就可以了
宏变量只是文本替换,和真正意义上的变量是有区别的
SAS执行含有宏的语句的时候是先解析出文本内容,再执行的
所以在一个data步里完成宏的赋值和执行是几乎不可能的,使用call execute之类不算......
Let them be hard, but never unjust

使用道具

10
revelc 发表于 2010-12-28 11:18:41 |只看作者 |坛友微信交流群
5# elek.me

多谢解答!尝试了一下,这样的话调用这些宏需要生成N个不同的data步才能实现我的目的。似乎还是不能在单个data步内逐行调用。不知有没有更高效的法子?也许对SAS是苛刻了?
楼上: 可以在%do i = 1 %to &N下用&&weight_&i来调用。

使用道具

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

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

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

GMT+8, 2024-4-28 18:36