<?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: Data Manipulation question in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599290#M172969</link>
    <description>&lt;P&gt;Alternatively please try&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input Code1 :$20. Group :$20. Val1 Val2 Val3;
datalines;
A100 Big 90 45 25
A100 Medium 60 70 33
B100 Medium 60 70 33
B100 Small 60 70 33
C100 Big 60 34 45
C100 Medium 60 70 33
C100 Small 60 70 33
;
run;

proc freq data=have noprint;
table code1*group/out=dummy(drop=count percent)  sparse;
run;

proc sort data=have;
by code1 group;
run;

proc sort data=dummy;
by code1 group;
run;

data want;
merge have(in=a) dummy(in=b);
by code1 group;
if b;
if b and not a then do;
val1=0;
val2=0;
val3=0;
end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Fri, 25 Oct 2019 11:32:33 GMT</pubDate>
    <dc:creator>Jagadishkatam</dc:creator>
    <dc:date>2019-10-25T11:32:33Z</dc:date>
    <item>
      <title>Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599229#M172927</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;how can the below be achieved&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data have;&lt;BR /&gt;input Code1 :$20. Group :$20. Val1 Val2 Val3;&lt;BR /&gt;datalines;&lt;BR /&gt;A100 Big 90 45 25&lt;BR /&gt;A100 Medium 60 70 33&lt;BR /&gt;B100 Medium 60 70 33&lt;BR /&gt;B100 Small 60 70 33&lt;BR /&gt;C100 Big 60 34 45&lt;BR /&gt;C100 Medium 60 70 33&lt;BR /&gt;C100 Small 60 70 33&lt;BR /&gt;;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Want &lt;BR /&gt;---&lt;BR /&gt;A100 Big 90 45 25&lt;BR /&gt;A100 Medium 60 70 33&lt;BR /&gt;A100 Small 0 0 0&lt;BR /&gt;B100 Big 0 0 0&lt;BR /&gt;B100 Medium 60 70 33&lt;BR /&gt;B100 Small 60 70 33&lt;BR /&gt;C100 Big 60 34 45&lt;BR /&gt;C100 Medium 60 70 33&lt;BR /&gt;C100 Small 60 70 33&lt;/P&gt;</description>
      <pubDate>Fri, 25 Oct 2019 03:44:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599229#M172927</guid>
      <dc:creator>dennis_oz</dc:creator>
      <dc:date>2019-10-25T03:44:14Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599232#M172930</link>
      <description>&lt;P&gt;The rough way:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
do until (last.code1);
	set have; by code1;
	select (group);
		when ("Big") do;
			b1=val1; b2=val2; b3=val3; end;
		when ("Medium") do;
			m1=val1; m2=val2; m3=val3; end;	
		when ("Small") do;
			s1=val1; s2=val2; s3=val3; end;
		otherwise;
		end;
	end;
group = "Big"; val1=coalesce(b1, 0); val2=coalesce(b2, 0); val3=coalesce(b3, 0); output;
group = "Medium"; val1=coalesce(m1, 0); val2=coalesce(m2, 0); val3=coalesce(m3, 0); output; 
group = "Small"; val1=coalesce(s1, 0); val2=coalesce(s2, 0); val3=coalesce(s3, 0); output;
keep code1 group val1 val2 val3;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 25 Oct 2019 04:48:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599232#M172930</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2019-10-25T04:48:28Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599233#M172931</link>
      <description>&lt;P&gt;The SQL way:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
select 
	a.code1, b.group, 
	coalesce(c.val1,0) as val1,
	coalesce(c.val2,0) as val2,
	coalesce(c.val3,0) as val3
from
	(select unique code1 from have) as a cross join
	(select unique group from have) as b left join
	have as c 
		on a.code1=c.code1 and b.group=c.group
order by code1, group;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 25 Oct 2019 04:59:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599233#M172931</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2019-10-25T04:59:07Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599244#M172933</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/19264"&gt;@dennis_oz&lt;/a&gt;:&lt;/P&gt;
&lt;P&gt;To &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats&lt;/a&gt;' "rough way" and "SQL way", I would add a "mixed way":&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have ;                                                                                                                             
  input code :$20. group :$20. val1-val3 ;                                                                                              
  cards ;                                                                                                                               
A100  Big     90  45  25                                                                                                                
A100  Medium  60  70  33                                                                                                                
B100  Medium  60  70  33                                                                                                                
B100  Small   60  70  33                                                                                                                
C100  Big     60  34  45                                                                                                                
C100  Medium  60  70  33                                                                                                                
C100  Small   60  70  33                                                                                                                
;                                                                                                                                       
run ;                                                                                                                                   
                                                                                                                                        
proc sql ;                                                                                                                              
  create view exc as                                                                                                                    
  select distinct a.code, b.group from have a, have b                                                                                   
  except                                                                                                                                
  select distinct code, group from have                                                                                                 
  order 1, 2                                                                                                                            
  ;                                                                                                                                     
quit ;                                                                                                                                  
                                                                                                                                        
data want ;                                                                                                                             
  merge have (in=h) exc ;                                                                                                               
  by code group ;                                                                                                                       
  array v val: ;                                                                                                                        
  if not h then do over v ;                                                                                                             
    v = 0 ;                                                                                                                             
  end ;                                                                                                                                 
run ;                 
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;EDIT: On second thought, it is more efficient (and more concise) to do it this way (obviously, under the assumption that HAVE is sorted by [code,group]:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data = have completetypes nway ;                                                                                   
  class code group ;                                                                                                                    
  var val: ;                                                                                                                            
  output out = allgroups (drop = _:) nmiss= ;                                                                                             
run ;                                                                                                                                   
                                                                                                                                        
data want ;                                                                                                                             
  merge allgroups have ;                                                                                                                
  by code group ;                                                                                                                       
run ;   
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Kind regards&lt;/P&gt;
&lt;P&gt;Paul D.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 25 Oct 2019 18:25:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599244#M172933</guid>
      <dc:creator>hashman</dc:creator>
      <dc:date>2019-10-25T18:25:16Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599290#M172969</link>
      <description>&lt;P&gt;Alternatively please try&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input Code1 :$20. Group :$20. Val1 Val2 Val3;
datalines;
A100 Big 90 45 25
A100 Medium 60 70 33
B100 Medium 60 70 33
B100 Small 60 70 33
C100 Big 60 34 45
C100 Medium 60 70 33
C100 Small 60 70 33
;
run;

proc freq data=have noprint;
table code1*group/out=dummy(drop=count percent)  sparse;
run;

proc sort data=have;
by code1 group;
run;

proc sort data=dummy;
by code1 group;
run;

data want;
merge have(in=a) dummy(in=b);
by code1 group;
if b;
if b and not a then do;
val1=0;
val2=0;
val3=0;
end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 25 Oct 2019 11:32:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599290#M172969</guid>
      <dc:creator>Jagadishkatam</dc:creator>
      <dc:date>2019-10-25T11:32:33Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599622#M173116</link>
      <description>Hi, thanks for sending this .. it's awesome to see this requirement can be done in these many ways</description>
      <pubDate>Sun, 27 Oct 2019 10:23:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599622#M173116</guid>
      <dc:creator>dennis_oz</dc:creator>
      <dc:date>2019-10-27T10:23:25Z</dc:date>
    </item>
    <item>
      <title>Re: Data Manipulation question</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599623#M173117</link>
      <description>Hi &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/12151"&gt;@Jagadishkatam&lt;/a&gt;, this works brilliantly as well .&lt;BR /&gt;thanks for showing that " Proc FREQ" can do this .</description>
      <pubDate>Sun, 27 Oct 2019 10:32:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Data-Manipulation-question/m-p/599623#M173117</guid>
      <dc:creator>dennis_oz</dc:creator>
      <dc:date>2019-10-27T10:32:19Z</dc:date>
    </item>
  </channel>
</rss>

