<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Matching minimum difference by group in SAS Data Management</title>
    <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683035#M19542</link>
    <description>&lt;P&gt;When you say "minimum difference" do you mean absolute value of difference?&lt;/P&gt;</description>
    <pubDate>Thu, 10 Sep 2020 18:54:10 GMT</pubDate>
    <dc:creator>PGStats</dc:creator>
    <dc:date>2020-09-10T18:54:10Z</dc:date>
    <item>
      <title>Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683029#M19540</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I have two datasets that look like the following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Dataset 1:&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;sbdv&lt;/TD&gt;&lt;TD&gt;num&lt;/TD&gt;&lt;TD&gt;loc&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;TD&gt;0.876&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;160&lt;/TD&gt;&lt;TD&gt;0.993&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;171&lt;/TD&gt;&lt;TD&gt;0.937&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Dataset 2:&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;sbdv&lt;/TD&gt;&lt;TD&gt;num&lt;/TD&gt;&lt;TD&gt;loc&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120&lt;/TD&gt;&lt;TD&gt;0.987&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;121&lt;/TD&gt;&lt;TD&gt;0.965&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;123&lt;/TD&gt;&lt;TD&gt;0.945&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;125&lt;/TD&gt;&lt;TD&gt;0.912&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want to create a new dataset that contains all of dataset 1 plus a match of observations in dataset 2 of the observations with the minimum difference in 'num' between each obs in dataset 1 and all the obs in dataset 2.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So for sbdv = 150, I want to calculate the difference between its 'num' (0.876) and sbdv 120, 121, 123, and 125's respective 'num' values (0.987, 0.965, 0.945, 0.912). Then I want to save each 'match' to a new dataset containing all of dataset 1 and the matches for each observation.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So for this example, the new dataset would be:&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;sbdv&lt;/TD&gt;&lt;TD&gt;num&lt;/TD&gt;&lt;TD&gt;loc&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;TD&gt;0.876&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;160&lt;/TD&gt;&lt;TD&gt;0.993&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;171&lt;/TD&gt;&lt;TD&gt;0.937&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;125&lt;/TD&gt;&lt;TD&gt;0.912&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;120&lt;/TD&gt;&lt;TD&gt;0.987&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;123&lt;/TD&gt;&lt;TD&gt;0.945&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am guessing there is a straight forward solution, but I haven't been able to find anything that explicitly will do this.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2020 18:43:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683029#M19540</guid>
      <dc:creator>nbs98495</dc:creator>
      <dc:date>2020-09-10T18:43:26Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683033#M19541</link>
      <description>&lt;P&gt;You don't need to know which observation from ds 2 match each observation from ds 1?&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2020 18:52:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683033#M19541</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2020-09-10T18:52:10Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683035#M19542</link>
      <description>&lt;P&gt;When you say "minimum difference" do you mean absolute value of difference?&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2020 18:54:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683035#M19542</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2020-09-10T18:54:10Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683036#M19543</link>
      <description>&lt;P&gt;No, just match ds 1 obs to ds 2 based on ds1 num - ds2 num&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2020 18:54:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683036#M19543</guid>
      <dc:creator>nbs98495</dc:creator>
      <dc:date>2020-09-10T18:54:11Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683049#M19544</link>
      <description>Yes!</description>
      <pubDate>Thu, 10 Sep 2020 19:20:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683049#M19544</guid>
      <dc:creator>nbs98495</dc:creator>
      <dc:date>2020-09-10T19:20:37Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683050#M19545</link>
      <description>&lt;P&gt;Assuming the pairing has to be one-to-one, this can be expressed as a linear assignment problem and solved easily with PROC OPTNET (a proc of SAS/OR):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ds1;
input sbdv  num loc;
datalines;
150   0.876   1
160   0.993   1
171   0.937   1
;
data ds2;
input sbdv  num loc;
datalines;
120   0.987   0
121   0.965   0
123   0.945   0
125   0.912   0
;

proc sql;
create table pairs as
select 
    ds1.sbdv as from,
    ds2.sbdv as to,
    abs(ds1.num-ds2.num) as weight
from ds1, ds2;
quit;

proc optnet data_links=pairs direction=directed;
linear_assignment out=selected_pairs;
run;

proc sql;
create table want as 
select sbdv, num, loc
from
    (select sbdv, num, loc from selected_pairs, ds1 where from=sbdv) 
    union all
    (select sbdv, num, loc from selected_pairs, ds2 where to=sbdv);
quit;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2020 19:22:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683050#M19545</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2020-09-10T19:22:45Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683056#M19546</link>
      <description>This works perfect, thanks!</description>
      <pubDate>Thu, 10 Sep 2020 19:39:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683056#M19546</guid>
      <dc:creator>nbs98495</dc:creator>
      <dc:date>2020-09-10T19:39:00Z</dc:date>
    </item>
    <item>
      <title>Re: Matching minimum difference by group</title>
      <link>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683232#M19550</link>
      <description>&lt;PRE&gt;data ds1;
input sbdv  num loc;
datalines;
150   0.876   1
160   0.993   1
171   0.937   1
;
data ds2;
input _sbdv  _num _loc;
datalines;
120   0.987   0
121   0.965   0
123   0.945   0
125   0.912   0
;
data want;
 if _n_=1 then do;
   if 0 then set ds2;
   declare hash h(dataset:'ds2');
   declare hiter hi('h');
   h.definekey('_sbdv');
   h.definedata(all:'y');
   h.definedone();
 end;
set ds1;
min=999999;
do while(hi.next()=0);
  dis=abs(num-_num);
  if dis&amp;lt;min then do;min=dis;sbdv1=_sbdv;num1=_num;loc1=_loc;end;
end;
h.remove(key:sbdv1);
drop _:  min dis;
run;&lt;/PRE&gt;</description>
      <pubDate>Fri, 11 Sep 2020 12:51:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Management/Matching-minimum-difference-by-group/m-p/683232#M19550</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2020-09-11T12:51:17Z</dc:date>
    </item>
  </channel>
</rss>

