<?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: Conditional statements and grouping observations in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854110#M337565</link>
    <description>&lt;P&gt;Slightly simpler:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set trans;
   if whichc('PCV20', of vax:) then complete=1;
   else if whichc('PCV15',of vax:) and whichc('PPSV23',of vax:) then complete=1;
   else if whichc('PCV13',of vax:) and whichc('PPSV23',of vax:) then complete=1;
   else complete=0;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I note that if there is also a code similar to the ones you list but with extra characters on the end, such as PCV20A, and you want complete to be zero in this case, then the solution from&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13884"&gt;@ballardw&lt;/a&gt;&amp;nbsp;will fail without additional programming.&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 17 Jan 2023 17:47:32 GMT</pubDate>
    <dc:creator>PaigeMiller</dc:creator>
    <dc:date>2023-01-17T17:47:32Z</dc:date>
    <item>
      <title>Conditional statements and grouping observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854101#M337563</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I have a list of pneumococcal vaccination administrations (n=2,400,000) and am trying to determine the best way to indicate if each person has met the criteria to be considered complete. The dataset is vertical. I have unique identifiers for each person and if that person has received more than one vaccination then they will have multiple observations listed. To be complete the person will need to meet one of these criteria:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;PCV15 + PPSV23&lt;/LI&gt;&lt;LI&gt;PCV20&lt;/LI&gt;&lt;LI&gt;PPSV23 + PCV15&lt;/LI&gt;&lt;LI&gt;PPSV23 + PCV20&lt;/LI&gt;&lt;LI&gt;PCV13 + PPSV23&lt;/LI&gt;&lt;LI&gt;PCV13 + PCV20&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;What would be the most efficient way to handle marking individuals as complete?&lt;/P&gt;&lt;P&gt;Below is an example using dummy data of what I have vs what I want.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;HAVE:&lt;/STRONG&gt;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Vaccine&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;PCV15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;PCV13&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;PPSV23&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;PCV13&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;PPSV23&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;PCV20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;PPSV23&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;PCV15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;PCV13&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;WANT (where 1 = complete and 0 = incomplete)&lt;/STRONG&gt;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Pneumo Complete&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&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;Thank you&lt;/P&gt;</description>
      <pubDate>Tue, 17 Jan 2023 15:14:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854101#M337563</guid>
      <dc:creator>OlsabeckT29</dc:creator>
      <dc:date>2023-01-17T15:14:58Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional statements and grouping observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854108#M337564</link>
      <description>&lt;P&gt;One way:&lt;/P&gt;
&lt;P&gt;Note use of data step to provide example data. You really should provide such as otherwise we guess as to variable types and may not result in code that works with your data.&lt;/P&gt;
&lt;P&gt;The transpose places all vaccinations for id on a single record. This requires sorting the data beforehand.&lt;/P&gt;
&lt;P&gt;With data in this form any of the combinations involving PCV20 really only use your rule of a single PCV20 is required.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data have;
input ID $ Vaccine $;
datalines;
1	PCV15
1	PCV13
1	PPSV23
2	PCV13
2	PPSV23
3	PCV20
4	PPSV23
4	PCV15
5	PCV13
;
proc sort data=have;
   by id ;
run;

proc transpose data=have out=trans
  prefix=vax;
  by id;
  var vaccine;
run;

data want;
   set trans;
   array v (*) vax: ;
   vaxall= catx(' ',of v(*));
   if index(vaxall,'PCV20')&amp;gt;0 then complete=1;
   else if index(vaxall,'PCV15')&amp;gt;0 and index(vaxall,'PPSV23')&amp;gt;0 then complete=1;
   else if index(vaxall,'PCV13')&amp;gt;0 and index(vaxall,'PPSV23')&amp;gt;0 then complete=1;
   else complete=0;
run;&lt;/PRE&gt;
&lt;P&gt;The array is just to create a shorter code for creating a space delimited variable with all of the vaccinations in a single variable. It does not assume how many vaccinations are available. The IF block searches for combinations as described in your question. Index function returns a character position so the &amp;gt;0 is used to find if it is present at all. Note that the function is case sensitive. If any of your actual values are may have different character case you should use&lt;/P&gt;
&lt;PRE&gt;   vaxall= upcase (catx(' ',of v(*)) );&lt;/PRE&gt;
&lt;P&gt;to make all of the letters upper case for the comparison.&lt;/P&gt;
&lt;P&gt;If you have not used arrays much the " of v(*) " is a way that many functions will use all of the values in the array.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After verifying the logic works you could drop the Vax1 - VaxN and Vaxall variables.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/417729"&gt;@OlsabeckT29&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Hello,&lt;/P&gt;
&lt;P&gt;I have a list of pneumococcal vaccination administrations (n=2,400,000) and am trying to determine the best way to indicate if each person has met the criteria to be considered complete. The dataset is vertical. I have unique identifiers for each person and if that person has received more than one vaccination then they will have multiple observations listed. To be complete the person will need to meet one of these criteria:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PCV15 + PPSV23&lt;/LI&gt;
&lt;LI&gt;PCV20&lt;/LI&gt;
&lt;LI&gt;PPSV23 + PCV15&lt;/LI&gt;
&lt;LI&gt;PPSV23 + PCV20&lt;/LI&gt;
&lt;LI&gt;PCV13 + PPSV23&lt;/LI&gt;
&lt;LI&gt;PCV13 + PCV20&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;What would be the most efficient way to handle marking individuals as complete?&lt;/P&gt;
&lt;P&gt;Below is an example using dummy data of what I have vs what I want.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;HAVE:&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;ID&lt;/TD&gt;
&lt;TD&gt;Vaccine&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;PCV15&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;PCV13&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;PPSV23&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;PCV13&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;PPSV23&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;PCV20&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;PPSV23&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;PCV15&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;5&lt;/TD&gt;
&lt;TD&gt;PCV13&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;WANT (where 1 = complete and 0 = incomplete)&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;ID&lt;/TD&gt;
&lt;TD&gt;Pneumo Complete&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;5&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;Thank you&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 17 Jan 2023 15:44:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854108#M337564</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2023-01-17T15:44:29Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional statements and grouping observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854110#M337565</link>
      <description>&lt;P&gt;Slightly simpler:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set trans;
   if whichc('PCV20', of vax:) then complete=1;
   else if whichc('PCV15',of vax:) and whichc('PPSV23',of vax:) then complete=1;
   else if whichc('PCV13',of vax:) and whichc('PPSV23',of vax:) then complete=1;
   else complete=0;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I note that if there is also a code similar to the ones you list but with extra characters on the end, such as PCV20A, and you want complete to be zero in this case, then the solution from&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13884"&gt;@ballardw&lt;/a&gt;&amp;nbsp;will fail without additional programming.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 17 Jan 2023 17:47:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854110#M337565</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2023-01-17T17:47:32Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional statements and grouping observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854157#M337573</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/417729"&gt;@OlsabeckT29&lt;/a&gt;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Your vertical "HAVE" dataset can also be used directly (i.e., without transposing). If it is sorted or at least grouped by ID (in the latter case use &lt;FONT face="courier new,courier"&gt;by id notsorted;&lt;/FONT&gt;), binary flags for the four relevant vaccines could be set in a DOW loop and the resulting bit pattern be evaluated after the last observation for the current ID has been processed:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(keep=id complete);
b=0;
do until(last.id);
  set have;
  by id;
  select(vaccine);
    when('PCV20')  b=bor(b,8);
    when('PPSV23') b=bor(b,4);
    when('PCV13')  b=bor(b,2);
    when('PCV15')  b=bor(b,1);
    otherwise;
  end;
end;
complete=b&amp;gt;4;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 17 Jan 2023 17:35:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854157#M337573</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2023-01-17T17:35:04Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional statements and grouping observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854301#M337619</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/*
Very interesting question
*/
data have;
input ID $ Vaccine $;
datalines;
1 PCV15
1 PCV13
1 PPSV23
2 PCV13
2 PPSV23
3 PCV20
4 PPSV23
4 PCV15
5 PCV13
;
data have;
 set have;
 dummy=1;
run;
proc glmselect data=have noprint outdesign(addinputvars)=temp;
class Vaccine;
model dummy= Vaccine/selection=none noint;
run;
proc summary data=temp nway;
class id;
var Vaccine_:;
output out=want(drop=_:) max=;
run;
data want;
 set want;
Completed=
(Vaccine_PCV15  and Vaccine_PPSV23) or 
 Vaccine_PCV20                      or 
(Vaccine_PPSV23 and Vaccine_PCV15)  or 
(Vaccine_PPSV23 and Vaccine_PCV20)  or 
(Vaccine_PCV13  and Vaccine_PPSV23) or 
(Vaccine_PCV13  and Vaccine_PCV20) 
;
 run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 18 Jan 2023 11:44:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-statements-and-grouping-observations/m-p/854301#M337619</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2023-01-18T11:44:54Z</dc:date>
    </item>
  </channel>
</rss>

