我想创建一个ID列表(bee_created),它组合了一个治疗组(i),复制(j)和序列号(k)。我有9个重复的工作,每个处理组的序列号略有变化。因此,在宏do循环中创建所有ID会更有效。我浏览了一些文章,我想可能会使用%扫描,但我无法生成工作代码。
对于每个复制品,有五个治疗组'aa','ab','ac','ea'和'ec'。我需要一个可以替换以下4个数据集的宏。注意唯一的区别在于i,j和k的值;否则是复制粘贴。提前致谢
/*dataset 1*/
data tag_num_replicate01_02;
length i $5. bee_created $9.;
exp_name="&exp_name";
do i= 'aa','ab', 'ac', 'ea','ec';
do j='01','02';
do k=101 to 210;
bee_created=compress (i||j||'-'||put(k, best.));
rename i=group_id;
output;
end;
end;
end;
run;
/*dataset 2*/
data tag_num_replicate04a;
length i $5. bee_created $9.;
exp_name="&exp_name";
do i= 'aa','ab', 'ac';
do j='04';
do k=501 to 615;
bee_created=compress (i||j||'-'||put(k, best.));
rename i=group_id;
output;
end;
end;
end;
run;
/*dataset 3*/
data tag_num_replicate04b;
length i $5. bee_created $9.;
exp_name="&exp_name";
do i= 'ea';
do j='04';
do k=501 to 623;
bee_created=compress (i||j||'-'||put(k, best.));
rename i=group_id;
output;
end;
end;
end;
run;
/*dataset 4*/
data tag_num_replicate04c;
length i $5. bee_created $9.;
exp_name="&exp_name";
do i= 'ec';
do j='04';
do k=501 to 620;
bee_created=compress (i||j||'-'||put(k, best.));
rename i=group_id;
output;
end;
end;
end;
run;
我试图生成'aa','ab'和'ac'的列表,但最终创建了四个变量i,aa,ab和ac。如果您还能告诉我以下代码中的错误,我将非常感谢。
/*macro not working*/
%macro tag_generate(groups=);
data tag_num_test;
exp_name="&exp_name";
%do i= 1 %to 3;
j=%scan(&groups, &i);
output;
%end;
run;
%mend tag_generate;
%tag_generate(groups= aa ab ac);
常
答案 0 :(得分:0)
我认为您不需要进行宏循环或宏扫描 - 您可以使用数据步骤执行循环和常规扫描功能。
%macro tag_generate(i, j, krange, rep, exp);
data tag_num_replicate&rep;
length i $5. j $5.;
exp_name=&exp;
do inum = 1 to count(&i, ' ')+1;
i = scan(&i, inum);
do jnum = 1 to count(&j, ' ')+1;
j = scan(&j, jnum);
do k = &krange;
bee_created=compress (i||j||'-'||strip(k));
rename i=group_id;
drop inum jnum;
output;
end;
end;
end;
run;
%mend tag_generate;
%tag_generate("aa ab ac ea ec", "01 02", 101 to 202, 01_02, "expname1");
编辑:经过测试和修复。它现在应该工作。