这很简单。
这里的解决方案:
1) 创建数据集源:
data testa;
infile datalines dsd dlm=',';
input var1 : $200. var2 : $200. count : 8. ;
datalines;
cat1,no,1,
cat1,yes,4,
cat1,unkown,3,
cat2,no,7,
cat2,yes,3,
cat2,unkown,5,
cat3,no,2,
cat3,yes,9,
cat3,unkown,0,
;
run;
2) 变量列表的选择:cat1|cat2|cat3
proc sql;
select distinct(var1) into: list_var separated by '|' from testa;
run;
3) 逐一处理var列表
%macro processListVar(list_var);
data want;
run;
%let k=1;
%do %while (%qscan(&list_var, &k,|) ne );
%let var = %scan(&list_var, &k,|);
data testb(drop=var1 rename=(var2=comb));
set testa;
N=_N_+1+&k;
where var1="&var";
run;
data testc;
N=1+&k;
comb="&var";
count=.;
run;
data tmp;
set testb testc;
run;
proc sort data=tmp out=teste;
by N;
run;
data want;
set want teste;
run;
%put var=&var;
%let k = %eval(&k + 1);
%end;
%mend processListVar;
%processListVar(&list_var);
4) 最后你会得到数据集中想要的结果。
您必须像这样最终排除 N 列:
data want_cleaned (drop=N);
set want;
run;
5) 更多代码说明。
一个。关键问题是保持 cat1,cat2,cat3 之间的顺序。
b.因此,我将问题按每个数据集 cat1、cat2、.. 进行了划分,并创建了一个 %do %while 来循环遍历类别。
c。我们使用 N 列,来计算行数(就像一个索引),然后我们可以在这个列上进行排序,保持顺序。
d。例如: 第一个 var cat1 :我们选择列 var2,我们将其重命名为梳状列。我们删除 var1 列。它创建 testb 数据集。
testb 数据集用于创建索引(第 N 列),我们在 testc 中创建子数据集的第一行(N=1+&k)。 &k 用于所有子数据集。就像索引在子数据集之间继续一样。 (互不干扰)。我们在 testb 和 testc 之间进行合并。数据集 tmp 包含 cat1 所需的所有信息。然后我们合并 dataset want 中的所有子数据集。
总而言之,我们创建了一个循环,最后将数据集合并在一起。我们对 N 列进行排序,以按您想要的顺序显示行。
问候,