<?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 scan a binary variable for density in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149287#M29496</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You could supplement the DATA t_all ... by&lt;/P&gt;&lt;P&gt;DATA ... t_f(WHERE=(f));&lt;/P&gt;&lt;P&gt;LENGTH str $ 10;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;at bottom:&lt;/P&gt;&lt;P&gt;str = catt(OF vs(*));&lt;/P&gt;&lt;P&gt;f = (Find(str,'00000')&amp;gt;=1);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 19 Sep 2014 18:45:01 GMT</pubDate>
    <dc:creator>rcwright</dc:creator>
    <dc:date>2014-09-19T18:45:01Z</dc:date>
    <item>
      <title>How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149281#M29490</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;BR /&gt;Hi,&lt;/P&gt;&lt;P&gt;I have been working with a programmer for several months trying to find an acceptable solution to a programming issue with no luck.&amp;nbsp; Basically, I have a SAS dataset that has a binary variable (0,1) with one record for each minute of the day.&amp;nbsp; I would like to find periods of at least 10 minutes of the day where there is a specific density of 1's, namely periods of at least 80% 1's and 20% or less 0's.&amp;nbsp; I would like to create a new variable that flags each minute that is part of one of these dense periods of 1's.&amp;nbsp; Also, I would like 5 consecutive zero's to indicate an automatic end of a period dense in 1's.&amp;nbsp; I think this is likely a difficult programming issue and that it may not have a solution that is 100% accurate, but I am wondering if anyone has tried something like this in SAS before and has advice or can point me to any reading that might be helpful.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Sep 2014 17:26:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149281#M29490</guid>
      <dc:creator>khollid</dc:creator>
      <dc:date>2014-09-17T17:26:31Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149282#M29491</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Do you have a SAS/ETS licence? If so, have you looked at the EXPAND procedure? I think it would provide a good starting point towards your goals.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PG&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Sep 2014 18:22:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149282#M29491</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2014-09-17T18:22:07Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149283#M29492</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Do you have the date and time information in a SAS datetime variable?&lt;/P&gt;&lt;P&gt;When you say at least 10 minutes (10 sequential records) the "at least" says more are acceptable. How many is the largest number of sequential records are you willing to consider as a single run? Can or should these groups of records have any overlap? For example, suppose records 1 and 2 are both 0 but 3-10 are 1 followed by 11 and 12 as zeroes. There are 3 potential sets: records 1-10, 2-11 and 3 to 12. What is the rule for determining the sequence to evaluate in this case?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also if you could post some example or dummy data that shows the behavior, so we don't have to try to recreate it sight unseen, to try code against would be helpful.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Sep 2014 18:47:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149283#M29492</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2014-09-17T18:47:18Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149284#M29493</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I do have the date and time information as a SAS datetime variable, although thus far I have created a variable for minutes 1-1440 for each day and have been using that as my sequence number.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;10 minutes is the minimum, more than 10 minutes are acceptable and expected.&amp;nbsp; There is no set maximum for the length of the string.&amp;nbsp; However do note that the 0/1 data is a measure of physical activity intensity for a person at that minute, so I don't observe it continuing for many hours in the data.&amp;nbsp; Most strings are 10-20 minutes long.&amp;nbsp; A handful approach a couple of hours. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks for the example-I realize I forogt one rule.&amp;nbsp; The string must start and end with a 1.&amp;nbsp; However, your example of ambigous strings is still relevant.&amp;nbsp; This issue is why I said there might not be a 100% accurate/right way to write the program.&amp;nbsp; Ideally, I would like the program to maximize the number of points flagged in cases of ambiguity.&amp;nbsp; Otherwise, I think the rule would just have to be an administrative decision to include the first such points.&amp;nbsp; E.g. 1 0 0 &lt;SPAN style="text-decoration: underline;"&gt;1 1 1 1 1 1 1 0 0 1 1&lt;/SPAN&gt;&amp;nbsp; would mark the &lt;SPAN style="text-decoration: underline;"&gt;last&lt;/SPAN&gt; 11 points and leave off the first 3 (because 11&amp;gt;10) but &lt;SPAN style="text-decoration: underline;"&gt;1 0 0 1 1 1 1 1 1 1&lt;/SPAN&gt; 0 0 1 would mark the &lt;SPAN style="text-decoration: underline;"&gt;first&lt;/SPAN&gt; 10 observations and leave off the last 3 since the first and last 10 yield the same number of points.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In terms of the data, it is mostly 0s.&amp;nbsp; There are blips of 1s here and there and then the small sections of more dense 1s that I am trying to pick out.&amp;nbsp; The dataset is quite large, so identifying them by hand is very cumbersome.&amp;nbsp; Below is an example string.&amp;nbsp; The five zeros at the beginning and end set the section off from the rest of the data for the day.&amp;nbsp; I think the 2 underlined sections maximize the number of points flagged while still being less than or equal to 20% 0's.&amp;nbsp; The two sections are split because including those middle 2 zeros would bring the string above 20% zero.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 &lt;SPAN style="text-decoration: underline;"&gt;1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1&lt;/SPAN&gt; 0 0 &lt;SPAN style="text-decoration: underline;"&gt;1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lt;/SPAN&gt; 0 0 0 0 0&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Sep 2014 19:43:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149284#M29493</guid>
      <dc:creator>khollid</dc:creator>
      <dc:date>2014-09-17T19:43:29Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149285#M29494</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Reading the file sequentially. If there is a 0-&amp;gt;1 switch, it is a potential starting point for a run. So we store it in a hash object.&lt;/P&gt;&lt;P&gt;For each record (0 or 1):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; we update the data for each stored potential run: number of 1s&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if actual record is 1 we need to check conditions of a valid run (length&amp;gt;=10, 80% purity)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if check is OK, we also store the end position of the (valid) run. If there is already an end position for this valid run, we can safely overwrite it (only longest run needed)&lt;/P&gt;&lt;P&gt;When there are 5 consecutive 0s (or end of file), we can output the good runs (start pos, end pos)&lt;/P&gt;&lt;P&gt;Postprocessing: merging overlapping runs.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: line-through;"&gt;Following code is not tested (lot of syntax and logical errors), will test, when I have SAS.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Tested.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; input bit @@;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 1 1&lt;/P&gt;&lt;P&gt;0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1&lt;/P&gt;&lt;P&gt;1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1&lt;/P&gt;&lt;P&gt;0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lt;/P&gt;&lt;P&gt;0 0 0 0 0&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data periods(keep=startPos endPos);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if _n_=1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dcl hash runs(ordered:'y');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dcl hiter riter('runs');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.defineKey('startPos');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.defineData('startPos');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.defineData('num1s');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.defineData('endPos');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.defineDone();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have end=eof;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by bit notsorted;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if bit=1 and first.bit then do;/*0-&amp;gt;1 switch*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.add(key: pos, data: pos, data:0, data:0);/*potential run, storing it*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if bit=1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=riter.first();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while(rc=0);/*looping through all potential runs*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num1s=num1s+bit;/*maintaining count of 1s*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if pos-startPos+1&amp;gt;=10 and num1s/(pos-startPos+1)&amp;gt;=0.8 then do;/*good run*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endPos=pos;/*setting end position*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.replace();/*storing*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=riter.next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numCons0=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numCons0+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if numCons0=5 or eof then do;/*cut the runs: output good runs, delete everything*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=riter.first();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while(rc=0);/*looping through all potential runs*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if endPos&amp;gt;0 then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=riter.next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runs.clear();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*Post processing*/&lt;/P&gt;&lt;P&gt;proc sort data=periods out=periods_sorted;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by endPos startPos;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;data periodsNoOverlap;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set periods_sorted;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by endPos;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if first.endPos;/*keeping the lowest startPos*/&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="line-height: 1.5em; font-size: 10pt; text-decoration: line-through;"&gt;Sorry, but right now, I'm not sure, maybe not all the overlapping time intervals are removed by this procedure.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;There are still overlapping areas after this procedure Do you realy want to remove them? Experiment with this application, maybe you want to refine the definition of "run".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;According to the currend definition "maximal" runs are: 35-56, 49-80&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Message was edited by: Gergely Bathó&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Sep 2014 23:51:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149285#M29494</guid>
      <dc:creator>gergely_batho</dc:creator>
      <dc:date>2014-09-17T23:51:07Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149286#M29495</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Think this will get you started.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* create some test data */&lt;/P&gt;&lt;P&gt;DATA test;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DO t = '0:00'T TO '23:59'T;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v = (Uniform(0) &amp;gt; .5);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUTPUT test;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = Round(Intnx('second',t,59),.1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FORMAT t timeampm.;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DATA t_all t_80(WHERE=(p&amp;gt;= .8));&lt;/P&gt;&lt;P&gt;/* create two data sets, t_all has all records, t_80 has 80% */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET test;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ARRAY vs(*) vs1-vs10;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vs1 = v;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vs2 = Lag1(v);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vs3 = Lag2(v);&lt;/P&gt;&lt;P&gt;... * repeat pattern;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vs9 = Lag8(v);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vs10 = Lag9(v);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = Sum(OF vs(*));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = s/10;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Sep 2014 18:34:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149286#M29495</guid>
      <dc:creator>rcwright</dc:creator>
      <dc:date>2014-09-19T18:34:39Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149287#M29496</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You could supplement the DATA t_all ... by&lt;/P&gt;&lt;P&gt;DATA ... t_f(WHERE=(f));&lt;/P&gt;&lt;P&gt;LENGTH str $ 10;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;at bottom:&lt;/P&gt;&lt;P&gt;str = catt(OF vs(*));&lt;/P&gt;&lt;P&gt;f = (Find(str,'00000')&amp;gt;=1);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Sep 2014 18:45:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149287#M29496</guid>
      <dc:creator>rcwright</dc:creator>
      <dc:date>2014-09-19T18:45:01Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149288#M29497</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thank you, this looks very promising.&amp;nbsp; I have passed it on to the programmer I am working with-she hasn't used hash objects in SAS before so hopefully this will be a fresh perspective for her.&amp;nbsp; For your question, yes I would want to get rid of overlapping bits (edit: not necessarily get rid of, rather only include them in one run.&amp;nbsp; The run in which the points are not included would need to fit the conditions on its own without those points as well).&amp;nbsp; I need to isolate independent bouts of activity.&amp;nbsp; My overall goal is to describe where these bouts of activity are occurring, so if points are double counted it will alter that distribution.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Sep 2014 20:23:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149288#M29497</guid>
      <dc:creator>khollid</dc:creator>
      <dc:date>2014-09-19T20:23:10Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149289#M29498</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have not checked it manually, but the algorithm did (and I believe it is a good algorithm for this task): &lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;35-56, 49-80&lt;/SPAN&gt; are valid runs, but 35-80 is not! How would you merge and/or split them? The answer in this specific case in your previous post (the underlined runs), but what is the general rule? Split and merge until you find a maximal coverage for the whole day (for every section surrounded by 5 consecutive zeros), with no overlap?? If this is the case, it sounds like something for SAS/OR.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+1: There is one more speed-up possibility in the code, but right now I don't want to confuse your programmer &lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt; Tell me if it runs slow.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Sep 2014 21:24:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149289#M29498</guid>
      <dc:creator>gergely_batho</dc:creator>
      <dc:date>2014-09-19T21:24:22Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149290#M29499</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;OK. But I have to say there would be an override range . Is that what you expected ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;data have;
&amp;nbsp; input bit @@;
datalines;
0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 1 1
0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1
0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0
;
run;
proc transpose data=have out=temp;
run;
data x1(keep=start end want );
 set temp;
 length want $ 3000 ;
 array c{*} col: ;
 do start=1 to dim(c)-9;
&amp;nbsp;&amp;nbsp; if c{start}=1 then do;
&amp;nbsp;&amp;nbsp;&amp;nbsp; do end=start+9 to dim(c);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if c{end}=1 then do;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; five_zero=0; zero=0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=start to end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if c{i}=0 then do; five_zero+1; zero+1;end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else five_zero=0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;five_zero ge 5 then leave;&amp;nbsp; div=divide(zero,(end-start+1));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if div le 0.2 and zero ne 0 then do;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=start to end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; want=catx(' ',want,c{j}); 
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output; want=' ';
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
&amp;nbsp;&amp;nbsp; end;
 end;
run;
data x2;
 set x1;
 by start;
 if last.start;
run;
data want;
 set x2;
 by end;
 if first.end;
run;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Xia Keshan&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Message was edited by: xia keshan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 20 Sep 2014 13:24:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149290#M29499</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2014-09-20T13:24:19Z</dc:date>
    </item>
    <item>
      <title>Re: How to scan a binary variable for density</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149291#M29500</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I changed my mind.&amp;nbsp; I thought more about what you said about changing the definition.&amp;nbsp; I think it does make sense to include any point that is part of a potential run, but just not double counting the overlap points.&amp;nbsp; So all I need to do is expand the dataset produced by this code to the minute level and then delete the duplicates to yield any point that is part of a run that meets the definition, which I know how to do.&amp;nbsp; Thanks!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 26 Sep 2014 19:45:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-scan-a-binary-variable-for-density/m-p/149291#M29500</guid>
      <dc:creator>khollid</dc:creator>
      <dc:date>2014-09-26T19:45:53Z</dc:date>
    </item>
  </channel>
</rss>

