楼主: zgwshmily
5048 20

[原创博文] 求教如何根据每一行创建一个满足条件的宏变量? [推广有奖]

11
zgwshmily 发表于 2010-9-2 11:08:17
楼上的所有回复都没有考虑到变量长度的问题,实际问题如果变量太多,字符变量长度就会不够存储。

12
pobel 在职认证  发表于 2010-9-2 11:28:00
宏变量的值最长可以65534个字符。

Length string $32767;  够不够?
和谐拯救危机

13
soporaeternus 发表于 2010-9-2 12:10:41
同楼上疑问......
Let them be hard, but never unjust

14
zgwshmily 发表于 2010-9-2 20:21:51
不够. The variables' names are too long

15
soporaeternus 发表于 2010-9-2 21:38:36
  1. data test;
  2.         array v var1-var1000;
  3.         do j=1 to 10;
  4.                 do i=1 to 1000;
  5.                         v[i]=(ranuni(123)>0.5)*49;
  6.                 end;
  7.                 output;
  8.         end;
  9.         drop i j;
  10. run;

  11. data countmiss;

  12. length str $32767;
  13. set test;
  14. array v var1-var1000;
  15. n+1;
  16. str="";
  17. do i=1 to dim(v);
  18.         if 0<v(i)<=50 then str=catx(" ",str,compress("var"||i));
  19. end;
  20. /*call symput(compress("list"||n),str);*/
  21. run;
复制代码
没有截断啊......
楼主要不把代码那上来看下......
Let them be hard, but never unjust

16
zgwshmily 发表于 2010-9-3 02:08:57
[tr][/tr]
我写了下面一段程序,但是发现这个“n”,就是没有一行一行的递增。
data countmiss;
input var1 var2 var3 var4 var5 var6;
cards;
0 0 0 0 0 1.2
0 0 0 0 5.8 4.7
58.8 0 0 30 0 33.3
100 0 0 100 0 66.6
;
run;
options mlogic symbolgen;
%macro chk();
%let n=1;
data mi ;
    set countmiss;
    %let varlist&n=;
    %do i=1 %to 6;
          if 0 < var&i <= 50 then
          do;
          %let varlist&n=&&varlist&n var&i;
          end;
    %end;
    %let n=%eval(&n+1);
run;
%mend;
%chk;

17
pobel 在职认证  发表于 2010-9-3 07:14:29
15# zgwshmily

DATA步中不能用宏语句,如%let,%put,去读数据集中某个变量的值。因为宏语句总是在DATA步之前执行,也就是在一个DATA步的PDV还没有建立时,宏语句就已经执行。


你上面的宏相当于:

%macro chk();

    %let n=1;
    %let varlist&n=;
    %do i=1 %to 6;
          %let varlist&n=&&varlist&n var&i;
    %end;
    %let n=%eval(&n+1);

data mi ;
    set countmiss;
    %do i=1 %to 6;
          if 0 < var&i <= 50 then
          do;
          end;
    %end;
run;

%mend;

所以varlist宏变量没有涉及到数据集中的变量var1-var6。

当宏的执行效果不如所愿时,可以用options mprint;和 %put &macro-var;来查找问题出在哪里。
已有 1 人评分学术水平 热心指数 收起 理由
soporaeternus + 1 + 1

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

和谐拯救危机

18
liudeng2005 发表于 2010-9-3 09:02:26
果然博士,见识过!顶一个!哎哟,我的头!

19
peijiamei 发表于 2010-9-3 09:04:29
这个必须顶!
我的微博:http://t.sina.com.cn/1087192374
欢迎互相加关注!

20
zgwshmily 发表于 2010-9-3 10:25:29
总算遇到博士中的战斗机把问题搞定了,牛B!

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

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