<?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: Counting instances of 1 to 0 in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744098#M233063</link>
    <description>&lt;P&gt;Try this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
prev_flag = 0;
sum_one_to_zero = 0;
do until (last.id);
  set have;
  by id;
  if prev_flag = 1 and flag = 0 then sum_one_to_zero + 1;
  prev_flag = flag;
end;
prev_flag = 0;
do until (last.id);
  set have;
  by id;
  if prev_flag = 1 and flag = 0
  then one_to_zero = 1;
  else one_to_zero = .;
  output;
  prev_flag = flag;
end;
drop prev_flag;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Untested, for lack of usable example data (data step with datalines).&lt;/P&gt;</description>
    <pubDate>Thu, 27 May 2021 09:05:59 GMT</pubDate>
    <dc:creator>Kurt_Bremser</dc:creator>
    <dc:date>2021-05-27T09:05:59Z</dc:date>
    <item>
      <title>Counting instances of 1 to 0</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744095#M233061</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a large dataset with ID, month and flag (1 or 0) as shown below.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am trying to create a count by ID (variable '1_to_0'), so that for each month I can see if the flag has moved from 1 (previous month) to 0 (current month).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Then I need to sum all instances for that ID and create a separate variable ('1_to_0_sum').&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What is the most efficient way of writing this code?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks in advance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Month&lt;/TD&gt;&lt;TD&gt;flag&lt;/TD&gt;&lt;TD&gt;1_to_0&lt;/TD&gt;&lt;TD&gt;1_to_0_sum&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Mar-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Apr-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;May-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Jun-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Jul-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Aug-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Sep-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;Oct-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Apr-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;May-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Jun-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Jul-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Aug-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Sep-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Oct-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Nov-12&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Dec-12&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Jan-13&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;Feb-13&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Thu, 27 May 2021 08:33:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744095#M233061</guid>
      <dc:creator>PetePatel</dc:creator>
      <dc:date>2021-05-27T08:33:37Z</dc:date>
    </item>
    <item>
      <title>Re: Counting instances of 1 to 0</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744098#M233063</link>
      <description>&lt;P&gt;Try this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
prev_flag = 0;
sum_one_to_zero = 0;
do until (last.id);
  set have;
  by id;
  if prev_flag = 1 and flag = 0 then sum_one_to_zero + 1;
  prev_flag = flag;
end;
prev_flag = 0;
do until (last.id);
  set have;
  by id;
  if prev_flag = 1 and flag = 0
  then one_to_zero = 1;
  else one_to_zero = .;
  output;
  prev_flag = flag;
end;
drop prev_flag;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Untested, for lack of usable example data (data step with datalines).&lt;/P&gt;</description>
      <pubDate>Thu, 27 May 2021 09:05:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744098#M233063</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2021-05-27T09:05:59Z</dc:date>
    </item>
    <item>
      <title>Re: Counting instances of 1 to 0</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744123#M233070</link>
      <description>&lt;P&gt;This is a good task to wax a little didactic about using the queue-based nature of the lag function:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
  set have (in=firstpass)
      have (in=secondpass);
  by id;

  if firstpass then sum_one_to_zero + (lag(flag)=1 and flag=0);
  if first.id then sum_one_to_zero=0;

  if secondpass;

  if lag(flag)=1 and flag=0 then one_to_zero=1;
  if lag(id)^=id then one_to_zero=.;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The statement:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  if firstpass then sum_one_to_zero + (lag(flag)=1 and flag=0);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;compares the current flag to the preceding flag, building a total of transitions from 1 to 0. Because the lag function is in the then clause, it is applied only for firstpass cases - secondpass cases never impact the queue underlying the lag function.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To avoid results from the preceding id contaminating the current id, the sum is reset to zero at the start of each ID.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  if first.id then sum_one_to_zero=0;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The third use of the lag function is more subtle.&amp;nbsp; The statement&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  if lag(id)^=id then one_to_zero=.;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;appear to test whether the record-in-hand is the start of an id.&amp;nbsp; So why not just use&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  if first.id then one_to_zero=.;&amp;nbsp;&amp;nbsp;/*Do&amp;nbsp;not&amp;nbsp;use&amp;nbsp;this&amp;nbsp;for&amp;nbsp;secondpass*/&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Because this part of the program only deals with second_pass observations, while the first.id condition only exists for firstpass observations.&amp;nbsp; So you basically have to realize that this part of the program is only processing groups of secondpass observations.&lt;/P&gt;</description>
      <pubDate>Thu, 27 May 2021 12:06:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Counting-instances-of-1-to-0/m-p/744123#M233070</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2021-05-27T12:06:31Z</dc:date>
    </item>
  </channel>
</rss>

