<?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: How to remove specific ID based on a specific condition? in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856816#M82446</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/331070"&gt;@drchiragvyas&lt;/a&gt;&amp;nbsp;and welcome to the SAS Support Communities!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So you want to select entire "BY groups" (here: observations with a common ID) based on a condition involving more than just the first observation per group. You can do this in two steps (first, determine the IDs to keep or delete and then merge them back with the original data; examples have already been provided by&amp;nbsp;&lt;A class="trigger-hovercard" href="https://communities.sas.com/t5/user/viewprofilepage/user-id/111695" target="_blank"&gt;AndreaVianello&lt;/A&gt;&amp;nbsp;and &lt;A href="https://communities.sas.com/t5/user/viewprofilepage/user-id/10892" target="_blank" rel="noopener"&gt;PaigeMiller&lt;/A&gt;). But there are also several techniques which combine the two parts of the task in one step:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PROC SQL with a GROUP BY and a HAVING clause (using automatic remerging)&lt;/LI&gt;
&lt;LI&gt;double DOW loop (see, e.g.,&amp;nbsp;&lt;A href="https://www.lexjansen.com/phuse/2009/tu/TU01.pdf" target="_blank" rel="noopener"&gt;Practical Uses of the DOW Loop in Pharmaceutical Programming&lt;/A&gt;&amp;nbsp;for background information and more examples)&lt;/LI&gt;
&lt;LI&gt;self-interleaving (see, e.g., &lt;A href="https://communities.sas.com/t5/forums/searchpage/tab/message?filter=authorId&amp;amp;q=firstpass&amp;amp;author_id=31461&amp;amp;collapse_discussion=true" target="_blank" rel="noopener"&gt;many posts&lt;/A&gt; by &lt;A href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461" target="_blank" rel="noopener"&gt;mkeintz&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;PROC SQL (unlike the two DATA step techniques) tends to change the order of observations (within a group), unless the order is uniquely determined by an ORDER BY clause. In your example data, the combination if ID and v1 could serve as a sort key:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
select * from have
group by id
having count(distinct sessiontime)=1
order by id, v1;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The two DATA step techniques read each BY group twice. In the first pass, the first value of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; is stored in a temporary variable (named &lt;FONT face="courier new,courier"&gt;_st&lt;/FONT&gt; in the examples below) and a numeric flag variable (&lt;FONT face="courier new,courier"&gt;_del&lt;/FONT&gt;) is set to a positive value if a different&amp;nbsp;value of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; is encountered in the same BY group. In the second pass, only those BY groups are written to the output dataset for which the &lt;FONT face="courier new,courier"&gt;_del&lt;/FONT&gt; flag has not been set.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Double DOW loop:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=_:);
do until(last.id);
  set have;
  by id;
  if first.id then _st=sessiontime;
  else if sessiontime ne _st then _del=1;
end;
do until(last.id);
  set have;
  by id;
  if not _del then output;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Self-interleaving:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=_:);
set have have(in=a);
by id;
if first.id then do;
  _st=sessiontime;
  _del=0;
end;
else _del+(sessiontime ne _st);
if a and not _del;
retain _:;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note that the PROC SQL step would create a different result than the two DATA steps if there were &lt;EM&gt;missing values&lt;/EM&gt; of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt;: This is because&amp;nbsp;&lt;FONT face="courier new,courier"&gt;count(distinct sessiontime)&lt;/FONT&gt; counts only non-missing values, whereas the DATA steps handle missing values like any other values. So, an ID with &lt;EM&gt;only&lt;/EM&gt; (identical) missing&amp;nbsp;&lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; values would be selected by the DATA steps, but not by the PROC SQL step. However, an ID with one or more&lt;I&gt; &lt;/I&gt;missing &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; values together with a constant non-missing &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; value&amp;nbsp;would be selected by the PROC SQL step, but not by the DATA steps. Of course, all three techniques could be adapted to any requirements regarding missing values.&lt;/P&gt;</description>
    <pubDate>Thu, 02 Feb 2023 11:47:22 GMT</pubDate>
    <dc:creator>FreelanceReinh</dc:creator>
    <dc:date>2023-02-02T11:47:22Z</dc:date>
    <item>
      <title>How to remove specific ID based on a specific condition?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856779#M82443</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have 8 observations per subject ID. All subjects were asked to complete 8 tasks (i.e., 8 observations) in the same session, i.e., each ID should have an identical session time. However, in my dataset, for ID #5, 2 observations had the same session time, and 6 observations had the same session time. Therefore, I would like to exclude ID#5 from this example dataset. I have multiple IDs in my extended dataset. I would appreciate if someone could provide an example code to remove IDs with different session times.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Example dataset:&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;SessionTime&lt;/TD&gt;&lt;TD&gt;v1&lt;/TD&gt;&lt;TD&gt;v2&lt;/TD&gt;&lt;TD&gt;v3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;30&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16.7&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;16&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;16.7&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;18&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;TD&gt;26&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;18&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;18.2&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;18&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;21&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;19.3&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;29&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;20.3&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;20.3&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;TD&gt;22&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;24&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;26&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;28.4&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;TD&gt;33&lt;/TD&gt;&lt;TD&gt;12&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>Thu, 02 Feb 2023 00:24:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856779#M82443</guid>
      <dc:creator>drchiragvyas</dc:creator>
      <dc:date>2023-02-02T00:24:05Z</dc:date>
    </item>
    <item>
      <title>Re: How to remove specific ID based on a specific condition?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856800#M82444</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data Session;
 input ID SessionTime  v1 v2 v3 ;
cards;
1 18.2 2 3 6
1 18.2 3 7 8
1 18.2 4 6 12
1 18.2 6 8 10
1 18.2 8 9 22
1 18.2 9 10 25
1 18.2 10 12 30
1 16.7 12 17 4
2 16.7 3 7 6
2 16.7 4 11 10
2 16.7 5 10 8
2 16.7 7 12 20
2 16.7 9 13 23
2 16.7 10 14 28
2 16.7 11 16 2
2 16.7 13 21 4
3 18.2 4 11 8
3 18.2 5 15 6
3 18.2 6 14 18
3 18.2 8 16 21
3 18.2 10 17 26
3 18.2 11 18 0
3 18.2 12 20 2
3 18.2 14 25 6
4 19.3 5 15 4
4 19.3 6 19 16
4 19.3 7 18 19
4 19.3 9 20 24
4 19.3 11 21 7
4 19.3 12 22 0
4 19.3 13 24 4
4 19.3 15 29 2
5 20.3 6 19 14
5 20.3 7 23 17
5 28.4 8 22 22
5 28.4 10 24 5
5 28.4 12 25 5
5 28.4 13 26 2
5 28.4 14 28 0
5 28.4 16 33 12
;;; run;


proc sql ;
 create table chk as 
 select id, sessiontime, count(*) as frq
 from Session
 group by id, sessiontime
  having frq=8
 order by id, sessiontime
; quit;

proc sql; 
 create table session_ok as 
  select s.* 
   from session s 
    where id in (select id from  chk);
quit;
&lt;BR /&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;CODE class=" language-sas"&gt;&lt;BR /&gt;Also ID=1 have 18.2 and 16.7 different SessionTime.  &lt;/CODE&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 02 Feb 2023 09:55:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856800#M82444</guid>
      <dc:creator>AndreaVianello</dc:creator>
      <dc:date>2023-02-02T09:55:30Z</dc:date>
    </item>
    <item>
      <title>Re: How to remove specific ID based on a specific condition?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856813#M82445</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc summary data=have nway;
    class id;
    var sessiontime;
    output out=_stats_ range=sessiontime_range;
run;
data want;
    merge have _stats_;
    by id;
    if sessiontime_range=0;
    drop _type_ _freq_;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this code, we determine the mathematical range of the sessiontime values for each ID, then keep only those IDs for which the sessiontime range is zero.&lt;/P&gt;</description>
      <pubDate>Thu, 02 Feb 2023 11:14:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856813#M82445</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2023-02-02T11:14:55Z</dc:date>
    </item>
    <item>
      <title>Re: How to remove specific ID based on a specific condition?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856816#M82446</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/331070"&gt;@drchiragvyas&lt;/a&gt;&amp;nbsp;and welcome to the SAS Support Communities!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So you want to select entire "BY groups" (here: observations with a common ID) based on a condition involving more than just the first observation per group. You can do this in two steps (first, determine the IDs to keep or delete and then merge them back with the original data; examples have already been provided by&amp;nbsp;&lt;A class="trigger-hovercard" href="https://communities.sas.com/t5/user/viewprofilepage/user-id/111695" target="_blank"&gt;AndreaVianello&lt;/A&gt;&amp;nbsp;and &lt;A href="https://communities.sas.com/t5/user/viewprofilepage/user-id/10892" target="_blank" rel="noopener"&gt;PaigeMiller&lt;/A&gt;). But there are also several techniques which combine the two parts of the task in one step:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PROC SQL with a GROUP BY and a HAVING clause (using automatic remerging)&lt;/LI&gt;
&lt;LI&gt;double DOW loop (see, e.g.,&amp;nbsp;&lt;A href="https://www.lexjansen.com/phuse/2009/tu/TU01.pdf" target="_blank" rel="noopener"&gt;Practical Uses of the DOW Loop in Pharmaceutical Programming&lt;/A&gt;&amp;nbsp;for background information and more examples)&lt;/LI&gt;
&lt;LI&gt;self-interleaving (see, e.g., &lt;A href="https://communities.sas.com/t5/forums/searchpage/tab/message?filter=authorId&amp;amp;q=firstpass&amp;amp;author_id=31461&amp;amp;collapse_discussion=true" target="_blank" rel="noopener"&gt;many posts&lt;/A&gt; by &lt;A href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461" target="_blank" rel="noopener"&gt;mkeintz&lt;/A&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;PROC SQL (unlike the two DATA step techniques) tends to change the order of observations (within a group), unless the order is uniquely determined by an ORDER BY clause. In your example data, the combination if ID and v1 could serve as a sort key:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
select * from have
group by id
having count(distinct sessiontime)=1
order by id, v1;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The two DATA step techniques read each BY group twice. In the first pass, the first value of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; is stored in a temporary variable (named &lt;FONT face="courier new,courier"&gt;_st&lt;/FONT&gt; in the examples below) and a numeric flag variable (&lt;FONT face="courier new,courier"&gt;_del&lt;/FONT&gt;) is set to a positive value if a different&amp;nbsp;value of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; is encountered in the same BY group. In the second pass, only those BY groups are written to the output dataset for which the &lt;FONT face="courier new,courier"&gt;_del&lt;/FONT&gt; flag has not been set.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Double DOW loop:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=_:);
do until(last.id);
  set have;
  by id;
  if first.id then _st=sessiontime;
  else if sessiontime ne _st then _del=1;
end;
do until(last.id);
  set have;
  by id;
  if not _del then output;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Self-interleaving:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=_:);
set have have(in=a);
by id;
if first.id then do;
  _st=sessiontime;
  _del=0;
end;
else _del+(sessiontime ne _st);
if a and not _del;
retain _:;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note that the PROC SQL step would create a different result than the two DATA steps if there were &lt;EM&gt;missing values&lt;/EM&gt; of &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt;: This is because&amp;nbsp;&lt;FONT face="courier new,courier"&gt;count(distinct sessiontime)&lt;/FONT&gt; counts only non-missing values, whereas the DATA steps handle missing values like any other values. So, an ID with &lt;EM&gt;only&lt;/EM&gt; (identical) missing&amp;nbsp;&lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; values would be selected by the DATA steps, but not by the PROC SQL step. However, an ID with one or more&lt;I&gt; &lt;/I&gt;missing &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; values together with a constant non-missing &lt;FONT face="courier new,courier"&gt;SessionTime&lt;/FONT&gt; value&amp;nbsp;would be selected by the PROC SQL step, but not by the DATA steps. Of course, all three techniques could be adapted to any requirements regarding missing values.&lt;/P&gt;</description>
      <pubDate>Thu, 02 Feb 2023 11:47:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856816#M82446</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2023-02-02T11:47:22Z</dc:date>
    </item>
    <item>
      <title>Re: How to remove specific ID based on a specific condition?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856821#M82447</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards truncover expandtabs;
input ID SessionTime v1 v2 v3;
cards;
1 18.2 2 3 6
1 18.2 3 7 8
1 18.2 4 6 12
1 18.2 6 8 10
1 18.2 8 9 22
1 18.2 9 10 25
1 18.2 10 12 30
2 16.7 12 17 4
2 16.7 3 7 6
2 16.7 4 11 10
2 16.7 5 10 8
2 16.7 7 12 20
2 16.7 9 13 23
2 16.7 10 14 28
2 16.7 11 16 2
2 16.7 13 21 4
3 18.2 4 11 8
3 18.2 5 15 6
3 18.2 6 14 18
3 18.2 8 16 21
3 18.2 10 17 26
3 18.2 11 18 0
3 18.2 12 20 2
3 18.2 14 25 6
4 19.3 5 15 4
4 19.3 6 19 16
4 19.3 7 18 19
4 19.3 9 20 24
4 19.3 11 21 7
4 19.3 12 22 0
4 19.3 13 24 4
4 19.3 15 29 2
5 20.3 6 19 14
5 20.3 7 23 17
5 28.4 8 22 22
5 28.4 10 24 5
5 28.4 12 25 5
5 28.4 13 26 2
5 28.4 14 28 0
5 28.4 16 33 12
;

proc sql;
create table want as
select *
 from have
  group by id
   having range(SessionTime)=0;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 02 Feb 2023 12:19:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/How-to-remove-specific-ID-based-on-a-specific-condition/m-p/856821#M82447</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2023-02-02T12:19:52Z</dc:date>
    </item>
  </channel>
</rss>

