<?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: Combine iterative do loop with condition in SAS/IML Software and Matrix Computations</title>
    <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378968#M3633</link>
    <description>&lt;P&gt;Fireworks!&lt;/P&gt;&lt;P&gt;Thank you very much.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Side effect: I need to check why there are these empty combinations. The real life behind it says there shouldn't be.&lt;/P&gt;</description>
    <pubDate>Tue, 25 Jul 2017 13:05:14 GMT</pubDate>
    <dc:creator>MsGeritO</dc:creator>
    <dc:date>2017-07-25T13:05:14Z</dc:date>
    <item>
      <title>Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378888#M3625</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I would like to calculate the sum of a variable for each level conditional of the value of a third (and fourth) variable. Without the condition everything is fine:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;data somedata;&lt;BR /&gt;input id euro dummy1 dummy2;&lt;BR /&gt;cards;&lt;BR /&gt;1 12 0 1&lt;BR /&gt;1 23 1 1&lt;BR /&gt;1 56 1 1&lt;BR /&gt;1 23 1 0&lt;BR /&gt;2 22 0 1&lt;BR /&gt;2 24 1 1&lt;BR /&gt;2 34 1 1&lt;BR /&gt;2 10 1 0&lt;BR /&gt;3 19 0 1&lt;BR /&gt;3 28 1 1&lt;BR /&gt;3 56 1 1&lt;BR /&gt;3 21 1 0&lt;BR /&gt;4 21 0 1&lt;BR /&gt;4 34 1 1&lt;BR /&gt;4 32 1 1&lt;BR /&gt;4 43 1 0&lt;BR /&gt;;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc iml;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; use work.somedata;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; read all;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; uqid = unique(id);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; totalcost = j(1,ncol(uqid));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do i = 1 to ncol(uqid);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = loc(id = uqid[i]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; totalcost[i] = sum(euro[idx]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; print totalcost;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Now I would like to add something like&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;if dummy1 = 1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;or even&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;if ( dummy1 = 1 &amp;amp; dummy2 = 1 ) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, I cannot get it to run through. Adding&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;do i = 1 to ncol(uqid) while (dummy1 = 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;gives the wrong results.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It looks like a simple idea to me, but I seem to be searching for the wrong keywords on the internet. Any pointers are greatly appreciated!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you in advance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Greetings from Germany.&lt;/P&gt;&lt;P&gt;Gerit&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 07:31:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378888#M3625</guid>
      <dc:creator>MsGeritO</dc:creator>
      <dc:date>2017-07-25T07:31:38Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378911#M3626</link>
      <description>&lt;P&gt;You are adding the&amp;nbsp;reference to your dummy variables in the wrong place.&amp;nbsp;&amp;nbsp; It needs to be&amp;nbsp;within the LOC function, so you can pick out all the elements where the id is correct and the dummy variable is set.&amp;nbsp;&amp;nbsp;Try using syntax like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;   do i = 1 to ncol(uqid);
        idx = loc( id = uqid[i] &amp;amp; dummy1 = 1 );
        totalcost[i] = sum(euro[idx]);
   end;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 25 Jul 2017 09:16:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378911#M3626</guid>
      <dc:creator>IanWakeling</dc:creator>
      <dc:date>2017-07-25T09:16:46Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378945#M3629</link>
      <description>&lt;P&gt;Thank you Ian. It runs like a beauty on the sample set.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My original data set still puts up a fight though. Here "dummy1" is also numeric (as everything else). The data set is unsorted, has 68 columns, 198 individuals (id numbers) and 285,923 observations.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;After the equivalent line of the summation (totalcost[i] = sum(euro[idx]); ) I get the error message: "(execution) Matrix has not been set to a value." I am guessing that "idx" has not been filled with values properly in the preceding line (idx = loc(id = uqid[i] &amp;amp; dummy1 = 1); )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The original code reads:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc iml;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; use work.gesamt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; read all ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; uqid = unique(id);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; pkkst = j(1, ncol(uqid));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; skkst = j(1, ncol(uqid));&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1 to ncol(uqid) ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = loc(id = uqid[i] &amp;amp; pk = 1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; pkkst[i] = sum(euro[idx]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1 to ncol(uqid) ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = loc(id = uqid[i] &amp;amp; sk = 1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; skkst[i] = sum(euro[idx]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; print pkkst skkst;&lt;BR /&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any further ideas?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you again.&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 12:31:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378945#M3629</guid>
      <dc:creator>MsGeritO</dc:creator>
      <dc:date>2017-07-25T12:31:06Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378949#M3630</link>
      <description>&lt;P&gt;I presume you have some combinations of id and dummy with no data.&amp;nbsp;&amp;nbsp; So you should only attempt to calculate the sum where there is at least one value.&amp;nbsp;&amp;nbsp; Adding something like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;if ncol(idx)&amp;gt;0 then pkkst[i] = sum(euro[idx]); else pkkst[i]= . ;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;should work.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 12:40:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378949#M3630</guid>
      <dc:creator>IanWakeling</dc:creator>
      <dc:date>2017-07-25T12:40:30Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378951#M3631</link>
      <description>&lt;P&gt;If the condition is not satisfied, IML will return an empty matrix, which is an invalid subscript. &amp;nbsp;See the article &lt;A href="http://blogs.sas.com/content/iml/2012/11/19/beware-the-naked-loc.html" target="_self"&gt;"Beware the naked LOC."&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The solution is to test the index before you use it:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;if ncol(idx)&amp;gt;0 then 
   pkkst[i] = sum(euro[idx]);   
else 
   pkkst[i] = .; /* or zero? */&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;By the way, this technique is called &lt;A href="http://blogs.sas.com/content/iml/2011/11/01/the-unique-loc-trick-a-real-treat.html" target="_self"&gt;the "UNIQUE-LOC technique."&amp;nbsp;&lt;/A&gt;&amp;nbsp;&amp;nbsp;If this technique takes too long because there are many unique categories,&amp;nbsp;you might want to try an alternative technique known as the UNIQUEBY technique. See &lt;A href="http://blogs.sas.com/content/iml/2011/11/07/an-efficient-alternative-to-the-unique-loc-technique.html" target="_self"&gt;"An efficient alternative to the UNIQUE-LOC technique."&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 12:42:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378951#M3631</guid>
      <dc:creator>Rick_SAS</dc:creator>
      <dc:date>2017-07-25T12:42:40Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378968#M3633</link>
      <description>&lt;P&gt;Fireworks!&lt;/P&gt;&lt;P&gt;Thank you very much.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Side effect: I need to check why there are these empty combinations. The real life behind it says there shouldn't be.&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 13:05:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378968#M3633</guid>
      <dc:creator>MsGeritO</dc:creator>
      <dc:date>2017-07-25T13:05:14Z</dc:date>
    </item>
    <item>
      <title>Re: Combine iterative do loop with condition</title>
      <link>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378969#M3634</link>
      <description>&lt;P&gt;Thank you for the pointer on the uniqueby. Now that I have a solution to the initiating issue I will look into more efficiency as it is already on the slow side and this is just the start of my calculations.&lt;/P&gt;</description>
      <pubDate>Tue, 25 Jul 2017 13:06:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-IML-Software-and-Matrix/Combine-iterative-do-loop-with-condition/m-p/378969#M3634</guid>
      <dc:creator>MsGeritO</dc:creator>
      <dc:date>2017-07-25T13:06:54Z</dc:date>
    </item>
  </channel>
</rss>

