楼主: manchengfu
1612 4

[有偿编程] 宏中调用自动变量 [推广有奖]

  • 0关注
  • 0粉丝

本科生

50%

还不是VIP/贵宾

-

威望
0
论坛币
499 个
通用积分
1.8700
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
3090 点
帖子
84
精华
0
在线时间
83 小时
注册时间
2005-8-29
最后登录
2022-11-14
毕业学校
山西财经大学

10论坛币
自己试着写一个宏来计算Pearson相关系数。在把变量累计值赋值给新的宏变量时出错,不能执行。感觉是调用自动变量_n_或者观测数n时出了问题。请帮忙查看下该如何调整?谢谢!
  1. %macro Pearson(DSin,XVarlist,DSout);

  2. %let countX=%eval(%sysfunc(count(&XVarlist,%str( )))+1);
  3. %do i=1 %to &countX;
  4.         %let x&i=%scan(&XVarlist,&i,%str( ));
  5. %end;

  6. data temp;
  7. /*计算累加值*/
  8. set &DSin nobs=n;
  9. %DO i=1 %to &countX;
  10. %let xs&i=%sysfunc(cats(&&x&i,_s));
  11. retain &&xs&i 0;
  12. &&xs&i+&&x&i;
  13. %if _n_=n %then %do;
  14. call symput("xss_"||left(i),left(&&xs&i));
  15. %end;
  16. %end;
  17. run;

  18. data temp_2;
  19. /*计算均值*/
  20. set temp nobs=n;
  21. %DO i=1 %to &countX;
  22. %let xm&i=%sysfunc(cats(&&x&i,_m));
  23. &&xm&i=&&xss_&i/n;
  24. %end;
  25. run;

  26. %mend;
复制代码


关键词:varlist sysfunc pearson RETAIN symput 自动变量
沙发
learsaas 发表于 2016-12-24 12:01:06 |只看作者 |坛友微信交流群
  1.         if _n_=n then do;
  2.           call symput("xss_"||"%left(&i)",left(&&xs&i));
  3.         end;
复制代码

使用道具

藤椅
孤单的我们 发表于 2016-12-26 13:19:02 |只看作者 |坛友微信交流群
%if _N_=n %then ……
执行顺序并非LZ想象的这样,%if的执行在data step之前,而_N_和n是data step产生的

使用道具

板凳
manchengfu 发表于 2016-12-26 13:53:42 |只看作者 |坛友微信交流群
孤单的我们 发表于 2016-12-26 13:19
%if _N_=n %then ……
执行顺序并非LZ想象的这样,%if的执行在data step之前,而_N_和n是data step产生的
请教可以如何调整?

使用道具

报纸
manchengfu 发表于 2016-12-29 12:21:30 |只看作者 |坛友微信交流群
learsaas 发表于 2016-12-24 12:01
  1. if _n_=n then do;
  2.   call symput("xss_"||"%left(&i)",left(&&xs&i));
  3. end;
复制代码
多谢。
能否解释一下有%和没有的区别?一直很困惑。
另外i前面为什么要加&?

使用道具

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

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

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

GMT+8, 2024-4-24 12:06