楼主: zgwshmily
5046 20

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

  • 0关注
  • 1粉丝

已卖:408份资源

大专生

28%

还不是VIP/贵宾

-

威望
0
论坛币
2169 个
通用积分
1.0200
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
287 点
帖子
25
精华
0
在线时间
20 小时
注册时间
2010-8-28
最后登录
2013-2-25

楼主
zgwshmily 发表于 2010-9-2 08:40:38 |AI写论文
40论坛币
对下面这个data set我想实现的是针对每一行检查相应的变量var1 到变量var6。 如果值在0 到 50之间的话,就把每一个相应的变量名称存在一个macro variable,并且以空格隔开。所以最终我要的结果是:

根据第1行有个macro variable叫做list1, 在list1里面存有变量var6
根据第2行有个macro variable叫做list2, 在list2里面存有变量var5 var6
根据第3行有个macro variable叫做list3, 在list3里面存有变量var4 var6
根据第4行有个macro variable叫做list4, 在list4里面是空的

并且每一行的新建的宏变量名,都要以该行的行序数结尾,比如1到4行,宏变量名相应的为list1到list4。

关键难点在于实际工作中我有300多个变量,所以必须一开始就把满足条件的变量名存在宏变量里面,因为宏变量不会有长度的问题。如果先建立一个string变量存储那些满足条件的变量名,然后再放到宏变量里面结果会有问题。因为string变量的长度会不够(SAS字符变量最大长度是200)。由于长度问题,string里面的变量可能已经被自动截短了,只能得到一部分满足条件的变量名。

我写了下面一段程序,但是发现这个“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;

最佳答案

rockfido 查看完整内容

%macro chk(); %let n=1; data _null_ ;     set countmiss; call symput("list"||compress(_N_),"");     %do i=1 %to 6;           if 0 < var&i
关键词:Variable options varlist string symbol 如何 新建

本帖被以下文库推荐

沙发
rockfido 在职认证  发表于 2010-9-2 08:40:39
%macro chk();
%let n=1;
data _null_ ;
    set countmiss;
        call symput("list"||compress(_N_),"");
    %do i=1 %to 6;
          if 0 < var&i <= 50 then do;
          call symput("list"||compress(_N_), symget("list"||compress(_N_))||" "||"var&i       ");
          end;
    %end;
run;
%mend;
%chk;

%put list1=&list1 ; 
%put list2=&list2 ;
%put list3=&list3 ;
%put list4=&list4 ;

藤椅
zgwshmily 发表于 2010-9-2 08:45:21
不好意思上面的code 有点乱,data set 如下

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;

proc print data=countmiss; run;

板凳
pobel 在职认证  发表于 2010-9-2 09:16:23
data countmiss;
   input var1 var2 var3 var4 var5 var6;
   array temp(6) var1-var6;
   length value $80;
   value=" ";
   do i=1 to dim(temp);
      value=catx(" ",value,ifc(0<temp(i)<50,temp(i)," "));
   end;
   call symputx("list"||strip(_n_),value);
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;
%put _user_;
已有 1 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1

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

和谐拯救危机

报纸
alida2002 发表于 2010-9-2 09:23:23
努力回帖 勤工俭学 发帖回帖 再争上游

地板
xiaoxiahu0571 发表于 2010-9-2 09:32:24
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;
%macro aa();
data a1;
        set countmiss;
        format a $20.;
        a="";
        array var(*) var1-var6;
        %do i=1 %to 6 %by 1;
                if  0<var(&i.)<=50 then a=compress(a||"var&i.");
                else a=compress(a||"0");
        %end;
        a2=left(compress(tranwrd(a,"var"," var"),"0"));
run;
%mend();
%aa;

data _null_;
        set a1;
        call symput(compress("list"||_n_),a2);
run;
试了下  是可以实现的,期待高手更简单的方法

7
xiaoxiahu0571 发表于 2010-9-2 09:37:23
3# pobel

赞,速度好快,学习了

8
soporaeternus 发表于 2010-9-2 09:41:32
  1. data countmiss;
  2. length str $100;
  3. input var1 var2 var3 var4 var5 var6;
  4. array v var1-var6;
  5. n+1;
  6. str="";
  7. do i=1 to 6;
  8.         if 0<v(i)<=50 then str=catx(" ",str,compress("var"||i));
  9. end;

  10. call symput(compress("list"||n),str);
  11. cards;
  12. 0 0 0 0 0 1.2
  13. 0 0 0 0 5.8 4.7
  14. 58.8 0 0 30 0 33.3
  15. 100 0 0 100 0 66.6
  16. ;
  17. run;
  18. %put &list1;
  19. %put &list2;
  20. %put &list3;
  21. %put &list4;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1 异曲同工

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

Let them be hard, but never unjust

9
zgwshmily 发表于 2010-9-2 10:48:24
关键问题是实际中,我有300多个变量,所以必须一开始就存在宏变量里面。如果先建立一个string
然后再把string放到宏变量里面的话。由于长度问题,string里面的变量可能已经被截短了。

10
crackman 发表于 2010-9-2 10:51:00
原来楼上三位是一伙的

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

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