<?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: Pick the IDs from each group to make it fixed obs and loop through each group until meet the obs in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/345066#M79348</link>
    <description>&lt;P&gt;Excellent! Thanks for your time. you are the best.&lt;/P&gt;</description>
    <pubDate>Tue, 28 Mar 2017 16:41:55 GMT</pubDate>
    <dc:creator>kumarK</dc:creator>
    <dc:date>2017-03-28T16:41:55Z</dc:date>
    <item>
      <title>Pick the IDs from each group to make it fixed obs and loop through each group until meet the obs</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344718#M79238</link>
      <description>&lt;P&gt;Hello Guys&lt;/P&gt;
&lt;P&gt;i thnk its little tricky.. i have a dataset like this segment, iD and group. i want a macro that loops though each segments and picks 6 rows(2 rows from group w , 3 rows from b,1 rows from m) this 6 parameter should be dynamic parameters, in future if i need to change it 5 or 7 or whaterver obs from each group i can easily&amp;nbsp;change so please note this. and for next run again 6 rows if the groups id exhausted pick from other group to make it 6 rows and so on..and this is for multiple runs..i hope i explined the requirement if not do not hesitate to comment. Thanks&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="186"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;Segement&lt;/TD&gt;
&lt;TD width="43"&gt;ID&lt;/TD&gt;
&lt;TD width="66"&gt;group&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;101&lt;/TD&gt;
&lt;TD&gt;w&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;102&lt;/TD&gt;
&lt;TD&gt;w&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;103&lt;/TD&gt;
&lt;TD&gt;w&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;105&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;106&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;107&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;108&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;109&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;110&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;m&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;112&lt;/TD&gt;
&lt;TD&gt;m&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;115&lt;/TD&gt;
&lt;TD&gt;w&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;116&lt;/TD&gt;
&lt;TD&gt;w&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;117&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;118&lt;/TD&gt;
&lt;TD&gt;b&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;119&lt;/TD&gt;
&lt;TD&gt;m&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;output for only Segment 1:&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="626"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD colspan="2" width="133"&gt;1st run 6 records&lt;/TD&gt;
&lt;TD width="15"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD colspan="2" width="210"&gt;2nd run 6 records&lt;/TD&gt;
&lt;TD width="29"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="111"&gt;3rd run 6 records&lt;/TD&gt;
&lt;TD width="64"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="64"&gt;4th run records&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;from W 2 IDs&lt;/TD&gt;
&lt;TD&gt;101&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;from W remianing 1 IDs&lt;/TD&gt;
&lt;TD&gt;103&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;102&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;101&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;102&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;from B 3 remaining 3 IDs&lt;/TD&gt;
&lt;TD&gt;108&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;103&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;102&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;from B 3 IDs&lt;/TD&gt;
&lt;TD&gt;105&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;109&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;105&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;108&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;106&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;110&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;106&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;109&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;107&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;from m remianing 1 ID&lt;/TD&gt;
&lt;TD&gt;112&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;107&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;110&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;from m 1 IDs&lt;/TD&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;from w to q to make 6&lt;/TD&gt;
&lt;TD&gt;101&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;112&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;sample output for Segment 3:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="307"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD colspan="2" width="133"&gt;1st run 6 records&lt;/TD&gt;
&lt;TD width="15"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="159"&gt;2nd run&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2 from w&lt;/TD&gt;
&lt;TD&gt;115&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;116&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;116&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;117&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2 from b&lt;/TD&gt;
&lt;TD&gt;117&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;118&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;118&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;119&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1 from m&lt;/TD&gt;
&lt;TD&gt;119&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;115&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1 from w&lt;/TD&gt;
&lt;TD&gt;115&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;116&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Mon, 27 Mar 2017 18:23:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344718#M79238</guid>
      <dc:creator>kumarK</dc:creator>
      <dc:date>2017-03-27T18:23:26Z</dc:date>
    </item>
    <item>
      <title>Re: Pick the IDs from each group to make it fixed obs and loop through each group until meet the obs</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344759#M79248</link>
      <description>&lt;P&gt;I don't understand your replacement logic but, not dealing with the replacments, the following should at least get you started:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;%macro doit(w=2,b=3,m=1);
  data run1 (drop=counter total) remaining1 (drop=counter total);
    set have;
    by segement group notsorted;
    if group eq 'w' then total=&amp;amp;w.;
    else if group eq 'b' then total=&amp;amp;b.;
    else if group eq 'm' then total=&amp;amp;m.;
    if first.group then counter=0;
    if counter lt total then do;
      counter+1;
      output run1;
    end;
    else output remaining1;
  run;
  
  data run2 (drop=counter total) remaining2 (drop=counter total);
    set remaining1;
    by segement group notsorted;
    if group eq 'w' then total=&amp;amp;w.;
    else if group eq 'b' then total=&amp;amp;b.;
    else if group eq 'm' then total=&amp;amp;m.;
    if first.group then counter=0;
    if counter lt total then do;
      counter+1;
      output run2;
    end;
    else output remaining2;
  run;
%mend doit;

%doit()
&lt;/PRE&gt;
&lt;P&gt;Art, CEO, AnalystFinder.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Mar 2017 19:59:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344759#M79248</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2017-03-27T19:59:18Z</dc:date>
    </item>
    <item>
      <title>Re: Pick the IDs from each group to make it fixed obs and loop through each group until meet the obs</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344884#M79305</link>
      <description>&lt;P&gt;It is &amp;nbsp;very intesting question.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;How about this one.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs truncover;
input Segement	ID	group $;
cards;
1	101	w
1	102	w
1	103	w
1	105	b
1	106	b
1	107	b
1	108	b
1	109	b
1	110	b
1	111	m
1	112	m
3	115	w
3	116	w
3	117	b
3	118	b
3	119	m
;
run;
%let times=3;
%let w=2;
%let b=3;
%let m=1;

proc sort data=have;
by Segement	group;
run;
data want;
 set have;
 by Segement group;

 array w{9999} _temporary_;
 array b{9999} _temporary_;
 array m{9999} _temporary_;

 if first.segement then call missing(of w{*},of b{*},of m{*});
 if first.group then n=0;
 n+1;
 if group='w' then w{n}=id;
  else  if group='b' then b{n}=id;
   else  if group='m' then m{n}=id;

 if last.group then do;
 
   if group='w' then do;
    mm=0;
    do time=1 to &amp;amp;times;
     do i=1 to &amp;amp;w;
      mm+1;
      idx=mod(mm,n);
      if idx=0 then idx=n;
      id=w{idx};
      output;
     end;
    end;
   end;
   
    else  if group='b' then do;
    mm=0;
    do time=1 to &amp;amp;times;
     do i=1 to &amp;amp;b;
      mm+1;
      idx=mod(mm,n);
      if idx=0 then idx=n;
      id=b{idx};
      output;
     end;
    end;
   end;
   
    else  if group='m' then do;
    mm=0;
    do time=1 to &amp;amp;times;
     do i=1 to &amp;amp;m;
      mm+1;
      idx=mod(mm,n);
      if idx=0 then idx=n;
      id=m{idx};
      output;
     end;
    end;
   end;
     
 end;
 drop n mm i idx;
run;
proc sort data=want;
 by time;
run;
proc print noobs;run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 28 Mar 2017 05:21:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/344884#M79305</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2017-03-28T05:21:49Z</dc:date>
    </item>
    <item>
      <title>Re: Pick the IDs from each group to make it fixed obs and loop through each group until meet the obs</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/345066#M79348</link>
      <description>&lt;P&gt;Excellent! Thanks for your time. you are the best.&lt;/P&gt;</description>
      <pubDate>Tue, 28 Mar 2017 16:41:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pick-the-IDs-from-each-group-to-make-it-fixed-obs-and-loop/m-p/345066#M79348</guid>
      <dc:creator>kumarK</dc:creator>
      <dc:date>2017-03-28T16:41:55Z</dc:date>
    </item>
  </channel>
</rss>

