1

我有两个数据集,其中一些记录彼此相关。

例如

数据集1

变量1

abcde

坏男人

大爆炸

奇怪的

每天

确切地

数据集2

变量1

美国广播公司

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 中,新的 dataset1 应该如下所示

Var1 cnt 匹配 FM_dataset2_1 FM_dataset2_2

abcde 2 模糊 abc cde

bad man 2 模糊的 bad bad man a

大爆炸 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)自动自定义地图文件?

有人可以建议吗?

4

1 回答 1

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 */
于 2011-05-12T23:13:02.347 回答