我有两个数据集,其中一些记录彼此相关。
E.g。
dataSet1的
VAR1
ABCDE
坏人
大爆炸
奇怪
每天
准确
Dataset2
VAR1
ABC
CDE
坏
坏男人
陌生人
现在我想使用循环逻辑比较这些记录,这是我的代码。
%let id1 =%sysfunc(open(dataset2,in)); %let colterm =%sysfunc(varnum(& id1,var1)); %do%while(%sysfunc(fetch(& id1))eq 0); %let vterm =%sysfunc(getvarc(& id1,& colterm));
data dataset1;
set dataset1;
if index(strip(var1),strip("&vterm"))>0 or index(strip("&vterm"),strip(var1))>0 then do;/*when one contains the other*/
match="Fuzzy";
cnt=cnt+1;
end;
run;
%end;
proc sql noprint;
select max(cnt) into:maxnum/*to get max cnt*/
from dataset1;
quit;
现在,dataset1如下所示
Var1 cnt 匹配
abcde 2模糊
坏人2模糊
大爆炸0
奇怪1模糊
每天0
完全为0
我想将dataset2中的相关记录合并到dataset1中,新数据集1应如下所示
Var1 cnt 匹配 FM_dataset2_1 FM_dataset2_2
abcde 2 Fuzzy abc cde
坏人2模糊坏人坏人大爆炸0
奇怪的1模糊陌生人每天0
完全为0
正如您所看到的,新变量FM_dataset2_ 1 和FM_dataset2_ 2 是基于一个计数器cnt的自动重新分配的变量。但我无法想出使用SAS代码实现此步骤的正确方法。
此外,我需要将数据集输出到xml文件中。结果应如下所示
<text>abcde</text>
<match>Fuzzy</match>
<matchitem>abc</matchitem>
<matchitem>tecde</matchitem>
与上述问题一样,问题还在于如何确定matchitem元素的数量并写入文件。在xml映射文件中,我可以确定如下位置
<COLUMN name="FM_dataset2_1">
<PATH syntax="XPath">/../matchitem[position()=**1**]</PATH>
...
<COLUMN name="FM_dataset2_2">
<PATH syntax="XPath">/../matchitem[position()=**2**]</PATH>
但这必须逐个进行。是否可以自动根据cnt计数器(maxnum)自定义地图文件?
有人可以建议吗?
答案 0 :(得分:1)
我确信代码比以下更有效,但我试着坚持你的思路。我不熟悉使用XML引擎,因此我将把这部分留给其他人。否则,如果您需要手动创建它,那么您就在创建MAXNUM宏变量的正确轨道上,然后您可以在循环中使用它。
%let id1=%sysfunc(open(dataset2,in));
%let colterm=%sysfunc(varnum(&id1,var1));
%do %while(%sysfunc(fetch(&id1)) eq 0);
%let vterm=%sysfunc(getvarc(&id1,&colterm));
data dataset1;
set dataset1;
format vterm $20.;
if match eq "Fuzzy" then output;
if index(strip(var1),strip("&vterm"))>0 or index(strip("&vterm"),strip(var1))>0 then do;
cnt=sum(cnt,1);
match="Fuzzy";
vterm = "&vterm";
output;
end;
else do;
cnt=sum(cnt,0);
output;
end;
run;
proc sort data=dataset1;
by var1 match vterm descending cnt;
proc sort data=dataset1 nodupkey;
by var1 match vterm;
run;
%end;
proc sql;
create table maxcnt as
select
var1,
match,
max(cnt) as cnt
from dataset1
group by 1,2
;
quit;
run;
proc transpose data=dataset1 out=dataset1(drop=FM_dataset2_0 _name_) prefix=FM_dataset2_;
by var1 match;
id cnt;
var vterm;
run;
data dataset1;
merge dataset1 maxcnt;
by var1 match;
run;
%let id2=%sysfunc(close(&id1)); /*closes out dataset2 in case you need it later */