我必须根据不同的输入创建动态字符串。在下面的示例中将会更加清楚。
我将获得两个输入
然后我必须像下面那样准备字符串
(0,0,0,0,1,1,1,1,1,1)。
我知道我们必须在问题中添加一些代码,但是我对编码和SAS还是陌生的,因此我无法从任何内容入手。任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
您可以使用宏或数据步骤使其动态。请参阅以下代码:
options merror nomlogic mprint nosymbolgen;
/*Input number of Zeroes and length of string*/
%let num_zero=5;
%let strln=8;
/*Automatic calculation of length including commas*/
%let len=%eval(&strln+(&strln-1));
data str;
length strval $&len;
num_z=symget("num_zero");
stln=symget("strln");
num_1=stln-num_z;
do i=1 to num_z;
strval=catx(",",strval,"0");
end;
do j=1 to num_1;
strval=catx(",",strval,"1");
end;
drop num_z stln num_1 i j;
run;
proc print data=str; run;
答案 1 :(得分:0)
这是在数据步骤中执行此操作的简单方法。
data test;
input nzero totaln;
length string $200;
do i=1 to totaln;
string=catx(',',string,i>nzero);
end;
string=cats('(',string,')');
put string=;
drop i;
cards;
4 10
5 6
7 7
0 10
;
proc print; run;
结果:
Obs nzero totaln string
1 4 10 (0,0,0,0,1,1,1,1,1,1)
2 5 6 (0,0,0,0,0,1)
3 7 7 (0,0,0,0,0,0,0)
4 0 10 (1,1,1,1,1,1,1,1,1,1)
或者您可以制作一个宏来生成它。
%macro generate(nzero,totaln);
%local i sep;
(%do i=1 %to &totaln;&sep.%eval(&i>&nzero)%let sep=,;%end;)
%mend generate;
测试结果:
205 %put %generate(4,10);
(0,0,0,0,1,1,1,1,1,1)
206 %put %generate(5,6);
(0,0,0,0,0,1)
207 %put %generate(7,7);
(0,0,0,0,0,0,0)
208 %put %generate(0,10);
(1,1,1,1,1,1,1,1,1,1)
答案 2 :(得分:0)
您也可以使用repeat()
函数而不是使用循环来实现。我以为可以简化事情,但是对于这个确切的请求,它仍然有点混乱:
data want;
length x $200;
num_zero = 4;
length_of_string = 10;
x = cats('(',substr(cats(repeat('0,', num_zero-1), repeat('1,', length_of_string-num_zero-1)),1,length_of_string*2-1),')');
run;