SAS所有组合与宏变量

时间:2016-10-26 11:22:22

标签: arrays macros sas

我从其他地方偷了一些代码来创建所有变量组合。我需要这个来创建多个回归,然后确定最佳。我喜欢输出,因为我可以使用一行,并将变量的所有名称放在一个位置。

当我手动输入数据时,数组工作,但这需要跨越不同的数据并自行选择变量,因此我需要使用宏变量来输入数据。这不应该是一个问题,这适用于其他datasteps。有人能告诉我哪里出错了。

data test(keep=my_string);
length my_string $200.;
  array a[4] $ ('new1' 'new2' 'new3' 'new4');

  n = dim(a);

   do k=1 to n;
         do j=1 to comb(n,k);
             call allcomb(j,k,of a[*]);
                 do i = 1 to k;
                    if i=1 then do; my_string="";counter=0;end;
                    counter=counter+1;
                    my_string=catx(" ",my_string, a[i]);
                 if counter=k then output;

                 end;
           end;
    end;
run;

这个下一个元素不起作用。只是给了我错过的价值 - 但它知道它需要127 ...... subs只是一个宏变量,其中包含new1-new7。

rsubmit;
data xx(keep=my_string);
length my_string $200.;
  array a &subs;

  n = dim(a);

   do k=1 to n;
         do j=1 to comb(n,k);
             call allcomb(j,k,of a[*]);
                 do i = 1 to k;
                    if i=1 then do; my_string="";counter=0;end;
                    counter=counter+1;
                    my_string=catx(" ",my_string, a[i]);
                 if counter=k then output;

                 end;
           end;
    end;
run;
endrsubmit;

非常感谢您的帮助 Ĵ

2 个答案:

答案 0 :(得分:1)

如果您已将subs定义为

%let subs=new1-new7;

然后SAS认为这些是变量,而不是字符串值。如果删除keep=语句,您会看到SAS创建了变量new1-new7

您需要将其保留为第一个示例的格式。试试这个:

%let subs='new1' 'new2' 'new3' 'new4' 'new5' 'new6' 'new7';
%let n=7;
data xx(keep=my_string);
length my_string $200.;
  array a[&n] $ (&subs);

  n = dim(a);

   do k=1 to n;
         do j=1 to comb(n,k);
             call allcomb(j,k,of a[*]);
                 do i = 1 to k;
                    if i=1 then do; my_string="";counter=0;end;
                    counter=counter+1;
                    my_string=catx(" ",my_string, a[i]);
                 if counter=k then output;

                 end;
           end;
    end;
run;

如果要使用您拥有的表单,则必须读取数组中变量的名称并使用它。在这里,我正在创建一个新的字符串数组来保存名称。您只需更改n的值,看看这将适用于所有值(直到my_string中的空间不足,我的尺寸增加了):

%let n=7;
%let subs=new1-new&n;

data xx(keep=my_string);
length my_string $1000.;
  array v &subs;
  array a[&n] $32. _temporary_;

  n = dim(v);

  do i=1 to n;
     a[i] = vname(v[i]); 
  end;

   do k=1 to n;
         do j=1 to comb(n,k);
             call allcomb(j,k,of a[*]);
                 do i = 1 to k;
                    if i=1 then do; my_string="";counter=0;end;
                    counter=counter+1;
                    my_string=catx(" ",my_string, a[i]);
                 if counter=k then output;

                 end;
           end;
    end;
run;

答案 1 :(得分:0)

对不起浪费时间。答案是我的阵列没有语音标记,所以我不得不用数组中的语音标记重新创建它。然后它就像一个魅力。

其中anz是宏中的数字。

rsubmit;
data hasitreallyworked;
length my_string $200.;
  array a[&anz] $ (&subs2); 

  n = dim(a);

   do k=1 to n;
         do j=1 to comb(n,k);
             call allcomb(j,k,of a[*]);
                 do i = 1 to k;
                    if i=1 then do; my_string="";counter=0;end;
                    counter=counter+1;
                    my_string=catx(" ",my_string, a[i]);
                 if counter=k then output;

                 end;
           end;
    end;
run;
endrsubmit;