我从其他地方偷了一些代码来创建所有变量组合。我需要这个来创建多个回归,然后确定最佳。我喜欢输出,因为我可以使用一行,并将变量的所有名称放在一个位置。
当我手动输入数据时,数组工作,但这需要跨越不同的数据并自行选择变量,因此我需要使用宏变量来输入数据。这不应该是一个问题,这适用于其他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;
非常感谢您的帮助 Ĵ
答案 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;