<?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: Resolving a formula dynamically in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46206#M12261</link>
    <description>You are right.&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Regards.&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
    <pubDate>Mon, 10 Jan 2011 03:32:27 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2011-01-10T03:32:27Z</dc:date>
    <item>
      <title>Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46195#M12250</link>
      <description>Hi there. I'd like to know if there's anybody out there who's got a better idea than mine to resolve a formula dynamically. Unfortunately, a macro couldn't help me. Or could it?&lt;BR /&gt;
&lt;BR /&gt;
The problem: A table contains values in columns a, b and a formula in column c which decided the result which is stored in column d:&lt;BR /&gt;
For index 1, columns a, b, and c contain 1, 2, and a+b, thus d should be 3.&lt;BR /&gt;
For index 2, columns a, b, and c contain 1, 2, and a*b, thus d should be 2.&lt;BR /&gt;
Columns a and be may contain other numeric values, c may contain other formulas in standard notation, and d should end up showing the result of the resolved formula in c.&lt;BR /&gt;
&lt;BR /&gt;
One solution that works, but is incredibly slow when the source data set is, say, more than 10.000 rows:&lt;BR /&gt;
data _null_;&lt;BR /&gt;
set abcd;&lt;BR /&gt;
call execute( "proc sql; update problem; set d = " || c || " where index = || index || "; quit;");&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
I also tried three call executes, where the first one created a temporary 1-row data set, the second appended this to the master data set, and the third deleted the temporary data set. The append was slow, so I tried the update routine. Unfortunately, this was slow, too.&lt;BR /&gt;
&lt;BR /&gt;
A short explanation to why I'm using call execute: Macros couldn't help me, since they evaluated in a completely different context from when my data steps did.&lt;BR /&gt;
&lt;BR /&gt;
If you have any questions, be my guest, and if you have any new ideas, I think I love you!</description>
      <pubDate>Tue, 07 Dec 2010 16:17:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46195#M12250</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2010-12-07T16:17:51Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46196#M12251</link>
      <description>Hi:&lt;BR /&gt;
  Did you try the "old school" approach instead of CALL EXECUTE?? See the program and log below. Note that the formula used for C must be a valid expression for an assignment statement and that for more complex formulas, you may end up needing to use macro quoting functions to protect the operators. Also, I used a "brute force" set of 4 IF statements -- there are ways to be more elegant with the macro code and probably more brief.&lt;BR /&gt;
             &lt;BR /&gt;
cynthia&lt;BR /&gt;
         &lt;BR /&gt;
The Program:&lt;BR /&gt;
[pre]&lt;BR /&gt;
data abcd;&lt;BR /&gt;
  infile datalines;&lt;BR /&gt;
  input index a b c $;&lt;BR /&gt;
  call symput('form'||put(index,1.0),trim(c));&lt;BR /&gt;
  call symput('lastind',put(index,2.0));&lt;BR /&gt;
return;&lt;BR /&gt;
datalines;&lt;BR /&gt;
1 1 2 a+b&lt;BR /&gt;
2 1 2 a*b&lt;BR /&gt;
3 1 2 a/b&lt;BR /&gt;
4 1 2 a**b&lt;BR /&gt;
;&lt;BR /&gt;
run;&lt;BR /&gt;
               &lt;BR /&gt;
%put form1= &amp;amp;form1;&lt;BR /&gt;
%put form2= &amp;amp;form2;&lt;BR /&gt;
%put lastind= &amp;amp;lastind;&lt;BR /&gt;
                          &lt;BR /&gt;
** Use the macro variable to "type" the formula into the program;   &lt;BR /&gt;
** You could make this program automatically generated with a macro;&lt;BR /&gt;
** program, but depending on how many values you have for INDEX, this;&lt;BR /&gt;
** approach is the quickest and easiest to code;&lt;BR /&gt;
data new;&lt;BR /&gt;
  set abcd;&lt;BR /&gt;
  if index = 1 then d = &amp;amp;form1;&lt;BR /&gt;
  else if index = 2 then d = &amp;amp;form2;&lt;BR /&gt;
  else if index = 3 then d = &amp;amp;form3;&lt;BR /&gt;
  else if index = 4 then d = &amp;amp;form4;&lt;BR /&gt;
  putlog index= a= b= c= d=;&lt;BR /&gt;
run;&lt;BR /&gt;
                &lt;BR /&gt;
ods listing;&lt;BR /&gt;
proc print data=new;&lt;BR /&gt;
title 'What is in the new dataset?';&lt;BR /&gt;
run;&lt;BR /&gt;
[/pre]&lt;BR /&gt;
                            &lt;BR /&gt;
The LOG showing the use of the macro variable in PUTLOG:&lt;BR /&gt;
[pre]&lt;BR /&gt;
1065  %put form1= &amp;amp;form1;&lt;BR /&gt;
form1= a+b&lt;BR /&gt;
1066  %put form2= &amp;amp;form2;&lt;BR /&gt;
form2= a*b&lt;BR /&gt;
1067  %put lastind= &amp;amp;lastind;&lt;BR /&gt;
lastind=  4&lt;BR /&gt;
1068&lt;BR /&gt;
1069  ** Use the macro variable to "type" the formula into the&lt;BR /&gt;
1069! program;&lt;BR /&gt;
1070  ** You could make this program automatically generated&lt;BR /&gt;
1070! with a macro;&lt;BR /&gt;
1071  ** program, but depending on how many values you have for&lt;BR /&gt;
1071! INDEX, this;&lt;BR /&gt;
1072  ** approach is the quickest and easiest to code;&lt;BR /&gt;
1073  data new;&lt;BR /&gt;
1074    set abcd;&lt;BR /&gt;
1075    if index = 1 then d = &amp;amp;form1;&lt;BR /&gt;
1076    else if index = 2 then d = &amp;amp;form2;&lt;BR /&gt;
1077    else if index = 3 then d = &amp;amp;form3;&lt;BR /&gt;
1078    else if index = 4 then d = &amp;amp;form4;&lt;BR /&gt;
1079    putlog index= a= b= c= d=;&lt;BR /&gt;
1080  run;&lt;BR /&gt;
                        &lt;BR /&gt;
index=1 a=1 b=2 c=a+b d=3&lt;BR /&gt;
index=2 a=1 b=2 c=a*b d=2&lt;BR /&gt;
index=3 a=1 b=2 c=a/b d=0.5&lt;BR /&gt;
index=4 a=1 b=2 c=a**b d=1&lt;BR /&gt;
NOTE: There were 4 observations read from the data set&lt;BR /&gt;
      WORK.ABCD.&lt;BR /&gt;
NOTE: The data set WORK.NEW has 4 observations and 5 variables.&lt;BR /&gt;
NOTE: DATA statement used (Total process time):&lt;BR /&gt;
      real time           0.01 seconds&lt;BR /&gt;
      cpu time            0.01 seconds&lt;BR /&gt;
&lt;BR /&gt;
                           &lt;BR /&gt;
1081&lt;BR /&gt;
1082  ods listing;&lt;BR /&gt;
1083  proc print data=new;&lt;BR /&gt;
1084  title 'What is in the new dataset?';&lt;BR /&gt;
1085  run;&lt;BR /&gt;
                         &lt;BR /&gt;
NOTE: There were 4 observations read from the data set WORK.NEW.&lt;BR /&gt;
NOTE: PROCEDURE PRINT used (Total process time):&lt;BR /&gt;
      real time           0.01 seconds&lt;BR /&gt;
      cpu time            0.01 seconds&lt;BR /&gt;
&lt;BR /&gt;
[/pre]</description>
      <pubDate>Tue, 07 Dec 2010 17:36:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46196#M12251</guid>
      <dc:creator>Cynthia_sas</dc:creator>
      <dc:date>2010-12-07T17:36:33Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46197#M12252</link>
      <description>Hello Anders Eggum,&lt;BR /&gt;
&lt;BR /&gt;
I do not understand why macro is not working. How about this solution:&lt;BR /&gt;
[pre]&lt;BR /&gt;
data i;&lt;BR /&gt;
  i=1; a=1; b=1; c="a*b"; output;&lt;BR /&gt;
  i=2; a=1; b=1; c="a+b"; output;&lt;BR /&gt;
run;&lt;BR /&gt;
proc SQL;&lt;BR /&gt;
  select COUNT(*) as n into :n from i;&lt;BR /&gt;
  %let n=%TRIM(&amp;amp;n);&lt;BR /&gt;
  select c into :c1-:c&amp;amp;n from i;&lt;BR /&gt;
quit;&lt;BR /&gt;
%macro a;&lt;BR /&gt;
data r;&lt;BR /&gt;
  set i;&lt;BR /&gt;
  %do i=1 %to &amp;amp;n; &lt;BR /&gt;
    if &amp;amp;i EQ _n_ then d=&amp;amp;&amp;amp;c&amp;amp;i;&lt;BR /&gt;
  %end;&lt;BR /&gt;
run;&lt;BR /&gt;
%mend;&lt;BR /&gt;
%a;&lt;BR /&gt;
[/pre]&lt;BR /&gt;
Sincerely,&lt;BR /&gt;
SPR</description>
      <pubDate>Tue, 07 Dec 2010 18:42:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46197#M12252</guid>
      <dc:creator>SPR</dc:creator>
      <dc:date>2010-12-07T18:42:40Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46198#M12253</link>
      <description>Hi.&lt;BR /&gt;
your code has lots lots of if statement which is a big mistake for a programmer,especially when have lots of if statement.And I am sure @chang_y_chung@hotmail.com will mock you very much.&lt;BR /&gt;
&lt;BR /&gt;
I agree with Cynthia ,it is only  execute one if statement each data step.And yours will execute lots lots of if statements for each data step  to exhaust system source.&lt;BR /&gt;
So I supported Cynthia.&lt;BR /&gt;
&lt;BR /&gt;
And I also am curious that why your code can not use macro ? Especia for your situation which is not included function.&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
      <pubDate>Wed, 08 Dec 2010 06:38:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46198#M12253</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2010-12-08T06:38:18Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46199#M12254</link>
      <description>The problem I had with my macro variables is that they resolved before or after my data step. Somehow, this didn't work. Unfortunately, I didn't keep the bad code.&lt;BR /&gt;
&lt;BR /&gt;
Anyway, thank you, both Cynthia and SPR for your replies. I'll check those solutions out. Here's another solution, which did work well (still a bit slow, but much faster than my call execute solution):&lt;BR /&gt;
&lt;BR /&gt;
*a test dataset (I tried this program out with 100,000 rows, which took about 5 minutes. So one million rows will still take a while...);&lt;BR /&gt;
data test;&lt;BR /&gt;
  a=1; b=2; c='a+b'; d=0; output;&lt;BR /&gt;
  a=1; b=2; c='a-b'; d=0; output;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
*create a temporary file;&lt;BR /&gt;
filename test temp;&lt;BR /&gt;
&lt;BR /&gt;
*build a sas program in the temporary file;&lt;BR /&gt;
*for each row in input dataset, resolve the function in c into d;&lt;BR /&gt;
data _null_;&lt;BR /&gt;
  set test end=last;&lt;BR /&gt;
  file test;&lt;BR /&gt;
  if _n_=1 then put 'data out;' /&lt;BR /&gt;
  'set test;' /&lt;BR /&gt;
  'if _n_=' _n_ 'then d=' c ';';&lt;BR /&gt;
  else put 'else if _n_ = ' _n_ 'then d=' c ';';&lt;BR /&gt;
  if last then put 'run;';&lt;BR /&gt;
run; &lt;BR /&gt;
&lt;BR /&gt;
*include the generated sas program, which runs the resolved functions;&lt;BR /&gt;
%inc test;</description>
      <pubDate>Wed, 08 Dec 2010 09:24:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46199#M12254</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2010-12-08T09:24:59Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46200#M12255</link>
      <description>If you don't need to maintain much numeric precision, then you can do something like below to take advantage of %sysevalf(). On my moderate PC, the second data step has 1M obs but ran in less than 30 seconds. Hope this helps a bit.&lt;BR /&gt;
&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;/*&amp;nbsp;test&amp;nbsp;data&amp;nbsp;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;data&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;one;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;1&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;to&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;1e6&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;/&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;2&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;1&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;b=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;2&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;c=&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'a+b'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;d=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;0&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;output&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;1&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;b=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;2&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;c=&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'a-b'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;d=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;0&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;output&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;run&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&amp;nbsp;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;data&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;two;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;set&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;one;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;length&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;m&amp;nbsp;$&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;200&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;retain&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;popen&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'('&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;pclose&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;')'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;c;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;transtrn(m,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'a'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;,&amp;nbsp;catt(popen,&amp;nbsp;put(a,&lt;/SPAN&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;best.&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;-l),&amp;nbsp;pclose));&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;transtrn(m,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'b'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;,&amp;nbsp;catt(popen,&amp;nbsp;put(b,&lt;/SPAN&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;best.&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;-l),&amp;nbsp;pclose));&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;catt(&lt;/SPAN&gt;&lt;SPAN style="color:#800080;font-family:Courier New;font-size:10pt;"&gt;'%sysevalf'&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;,&amp;nbsp;popen,&amp;nbsp;m,&amp;nbsp;pclose);&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;input(resolve(m),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;best.&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;keep&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;a&amp;nbsp;b&amp;nbsp;c&amp;nbsp;d;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;run&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;/*&amp;nbsp;on&amp;nbsp;log&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTE:&amp;nbsp;There&amp;nbsp;were&amp;nbsp;1000000&amp;nbsp;observations&amp;nbsp;read&amp;nbsp;from&amp;nbsp;the&amp;nbsp;data&amp;nbsp;set&amp;nbsp;WORK.ONE.&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTE:&amp;nbsp;The&amp;nbsp;data&amp;nbsp;set&amp;nbsp;WORK.TWO&amp;nbsp;has&amp;nbsp;1000000&amp;nbsp;observations&amp;nbsp;and&amp;nbsp;4&amp;nbsp;variables.&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTE:&amp;nbsp;DATA&amp;nbsp;statement&amp;nbsp;used&amp;nbsp;(Total&amp;nbsp;process&amp;nbsp;time):&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;real&amp;nbsp;time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;25.53&amp;nbsp;seconds&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cpu&amp;nbsp;time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;25.52&amp;nbsp;seconds&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&amp;nbsp;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;proc&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;print&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;data&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;=two(&lt;/SPAN&gt;&lt;SPAN style="color:#0000FF;font-family:Courier New;font-size:10pt;"&gt;obs&lt;/SPAN&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;=&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#008080;font-family:Courier New;font-size:10pt;"&gt;3&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;B&gt;&lt;SPAN style="color:#000080;font-family:Courier New;font-size:10pt;"&gt;run&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;/*&amp;nbsp;on&amp;nbsp;lst&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Obs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a+b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a-b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-1&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a+b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;
&lt;P style="padding:0"&gt;&lt;SPAN style="color:#008000;font-family:Courier New;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;*/&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 08 Dec 2010 15:29:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46200#M12255</guid>
      <dc:creator>chang_y_chung_hotmail_com</dc:creator>
      <dc:date>2010-12-08T15:29:54Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46201#M12256</link>
      <description>Thanks for a very interesting little piece of code. I'll give it a go. Thanks a lot to all of you. I hope I can contribute back to the forum, too... I'm impressed with the quick response and your good ideas. I'll make sure to provide some feedback when I try this out. For right now, I have to finish up some tasks that depended on these results, but I need to optimize the code afterwards, and that is when this comes in handy. Maybe tomorrow, maybe next week.</description>
      <pubDate>Wed, 08 Dec 2010 15:54:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46201#M12256</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2010-12-08T15:54:50Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46202#M12257</link>
      <description>Hello Ksharp,&lt;BR /&gt;
&lt;BR /&gt;
I did not see mocking remarks on my code from Chang_y_chung. However, I tried to optimize my code and got the following result:[pre]&lt;BR /&gt;
data i;&lt;BR /&gt;
  do l=1 to 500000;&lt;BR /&gt;
  i=1;  a=1;  b=1;  c="a*b";  output;&lt;BR /&gt;
  i=2;  a=1;  b=1;  c="a+b";  output;&lt;BR /&gt;
  end;&lt;BR /&gt;
run;&lt;BR /&gt;
options nomlogic nosymbolgen;&lt;BR /&gt;
proc SQL ;&lt;BR /&gt;
  select COUNT(*) as n into :n from i;&lt;BR /&gt;
quit;&lt;BR /&gt;
%let n=%TRIM(&amp;amp;n);&lt;BR /&gt;
%macro b(p=);&lt;BR /&gt;
%do i=&amp;amp;p %to &amp;amp;n %by &amp;amp;p;&lt;BR /&gt;
  data a;&lt;BR /&gt;
    set i;&lt;BR /&gt;
    if %EVAL(&amp;amp;i-&amp;amp;p) &amp;lt; _n_ &amp;lt;= &amp;amp;i then output; &lt;BR /&gt;
  run; &lt;BR /&gt;
  proc SQL noprint;&lt;BR /&gt;
    select COUNT(*) as n into :n1 from a;&lt;BR /&gt;
    %let n1=%TRIM(&amp;amp;n1);&lt;BR /&gt;
    select c into :c1-:c&amp;amp;n1 from i;&lt;BR /&gt;
  quit;&lt;BR /&gt;
  data b;&lt;BR /&gt;
    set a;&lt;BR /&gt;
    %do j=1 %to &amp;amp;n1;&lt;BR /&gt;
      if &amp;amp;j EQ _n_ then do;&lt;BR /&gt;
        d=&amp;amp;&amp;amp;c&amp;amp;j;&lt;BR /&gt;
      end;&lt;BR /&gt;
    %end;&lt;BR /&gt;
  run;&lt;BR /&gt;
  %if &amp;amp;i=&amp;amp;p %then %do; data r; set b; run; %end;&lt;BR /&gt;
  %else           %do; data r; set r b; run; %end;&lt;BR /&gt;
  %end;&lt;BR /&gt;
%mend b;&lt;BR /&gt;
%b(p=5000);&lt;BR /&gt;
;&lt;BR /&gt;
It does not compete with Chang's code and runs about 5 minutes for 1M observations.&lt;BR /&gt;
Sincerely,&lt;BR /&gt;
SPR</description>
      <pubDate>Wed, 08 Dec 2010 18:59:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46202#M12257</guid>
      <dc:creator>SPR</dc:creator>
      <dc:date>2010-12-08T18:59:09Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46203#M12258</link>
      <description>Just one more choice.&lt;BR /&gt;
Under my IBM R50 notebook, It spents several second to process ten thousands observations.&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
data _null_;&lt;BR /&gt;
 set temp end=last;&lt;BR /&gt;
 call symput(cats('d',_n_),c);&lt;BR /&gt;
 if last then call symput('nobs',_n_);&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
%macro data;&lt;BR /&gt;
data temp;&lt;BR /&gt;
 set temp;&lt;BR /&gt;
 select(_n_);&lt;BR /&gt;
   %do i=1 %to &amp;amp;nobs;&lt;BR /&gt;
    when (&amp;amp;i)  d = &amp;amp;&amp;amp;d&amp;amp;i ;&lt;BR /&gt;
   %end;&lt;BR /&gt;
 end;&lt;BR /&gt;
run;&lt;BR /&gt;
%mend;&lt;BR /&gt;
&lt;BR /&gt;
%data&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
&lt;BR /&gt;
194    data _null_;&lt;BR /&gt;
195     set temp end=last;&lt;BR /&gt;
196     call symput(cats('d',_n_),c);&lt;BR /&gt;
197     if last then call symput('nobs',_n_);&lt;BR /&gt;
198    run;&lt;BR /&gt;
&lt;BR /&gt;
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).&lt;BR /&gt;
      197:34&lt;BR /&gt;
NOTE: There were 10000 observations read from the data set WORK.TEMP.&lt;BR /&gt;
NOTE: DATA statement used (Total process time):&lt;BR /&gt;
      real time           0.25 seconds&lt;BR /&gt;
      cpu time            0.26 seconds&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
199&lt;BR /&gt;
200    %macro data;&lt;BR /&gt;
201    data temp;&lt;BR /&gt;
202     set temp;&lt;BR /&gt;
203     select(_n_);&lt;BR /&gt;
204       %do i=1 %to &amp;amp;nobs;&lt;BR /&gt;
205        when (&amp;amp;i)  d = &amp;amp;&amp;amp;d&amp;amp;i ;&lt;BR /&gt;
206       %end;&lt;BR /&gt;
207     end;&lt;BR /&gt;
208    run;&lt;BR /&gt;
209    %mend;&lt;BR /&gt;
210&lt;BR /&gt;
211    %data&lt;BR /&gt;
&lt;BR /&gt;
NOTE: There were 10000 observations read from the data set WORK.TEMP.&lt;BR /&gt;
NOTE: The data set WORK.TEMP has 10000 observations and 4 variables.&lt;BR /&gt;
NOTE: DATA statement used (Total process time):&lt;BR /&gt;
      real time           5.39 seconds&lt;BR /&gt;
      cpu time            5.32 seconds&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
      <pubDate>Fri, 10 Dec 2010 01:58:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46203#M12258</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2010-12-10T01:58:09Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46204#M12259</link>
      <description>Hi.&lt;BR /&gt;
I found another way.It looks like 'call execute' can do it absolutely.&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
options nonote;&lt;BR /&gt;
data temp;&lt;BR /&gt;
 do i=1 to 100;&lt;BR /&gt;
  a=2; b=5; c='a*b'; output;&lt;BR /&gt;
  a=5; b=6; c='a+b'; output;&lt;BR /&gt;
 end;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data temp;&lt;BR /&gt;
 set temp end=last;&lt;BR /&gt;
  if _n_ eq 1 then call execute('data result;');&lt;BR /&gt;
  call execute(cats('a=',a,';'));&lt;BR /&gt;
  call execute(cats('b=',b,';'));&lt;BR /&gt;
  call execute(cats("c='",c,"';"));&lt;BR /&gt;
  call execute(cats('d=',c,';'));&lt;BR /&gt;
  call execute('output;');&lt;BR /&gt;
  if last then call execute('run;');&lt;BR /&gt;
run;&lt;BR /&gt;
[/pre]&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
      <pubDate>Tue, 04 Jan 2011 01:13:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46204#M12259</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2011-01-04T01:13:49Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46205#M12260</link>
      <description>chang_y_chung's code is lot more efficient: you only process the data once, and you don't create a huge data step afterward.&lt;BR /&gt;
&lt;BR /&gt;
Creating TWO is 10 times faster than creating THREE.&lt;BR /&gt;
&lt;BR /&gt;
If you increase the number of loopings to 1e5, THREE runs out of memory.&lt;BR /&gt;
[pre]&lt;BR /&gt;
data ONE;&lt;BR /&gt;
  do _I = 1 to 1e4;&lt;BR /&gt;
    VAR1=ranuni(0); VAR2=ranuni(1); VAR3='VAR1+VAR2'; output;&lt;BR /&gt;
    VAR1=ranuni(2); VAR2=ranuni(3); VAR3='VAR1-VAR2'; output;&lt;BR /&gt;
  end;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
data TWO;&lt;BR /&gt;
  set ONE;&lt;BR /&gt;
  retain POPEN '(' PCLOSE ')'; &lt;BR /&gt;
  length _M $200;&lt;BR /&gt;
  _M = tranwrd(VAR3, 'VAR1', cats(POPEN, VAR1, PCLOSE));&lt;BR /&gt;
  _M = tranwrd(_M  , 'VAR2', cats(POPEN, VAR2, PCLOSE));&lt;BR /&gt;
  _M = cats('%sysevalf', POPEN, _M, PCLOSE);&lt;BR /&gt;
  VAR4 = input(resolve(_M),32.);   &lt;BR /&gt;
  keep VAR1 VAR2 VAR3 VAR4;&lt;BR /&gt;
run;&lt;BR /&gt;
&lt;BR /&gt;
option nosource;&lt;BR /&gt;
data _null_; &lt;BR /&gt;
  set ONE end=LASTOBS;  &lt;BR /&gt;
  if _N_ eq 1 then call execute('data THREE;'); &lt;BR /&gt;
  call execute(cats('VAR1=',VAR1       ,';'));  &lt;BR /&gt;
  call execute(cats('VAR2=',VAR2       ,';'));  &lt;BR /&gt;
  call execute(cats('VAR3=',quote(VAR3),';'));  &lt;BR /&gt;
  call execute(cats('VAR4=',VAR3       ,';'));  &lt;BR /&gt;
  call execute('output;');  &lt;BR /&gt;
  if LASTOBS then call execute('run;');&lt;BR /&gt;
run;&lt;BR /&gt;
option source;</description>
      <pubDate>Mon, 10 Jan 2011 02:04:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46205#M12260</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2011-01-10T02:04:43Z</dc:date>
    </item>
    <item>
      <title>Re: Resolving a formula dynamically</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46206#M12261</link>
      <description>You are right.&lt;BR /&gt;
&lt;BR /&gt;
&lt;BR /&gt;
Regards.&lt;BR /&gt;
&lt;BR /&gt;
Ksharp</description>
      <pubDate>Mon, 10 Jan 2011 03:32:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Resolving-a-formula-dynamically/m-p/46206#M12261</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2011-01-10T03:32:27Z</dc:date>
    </item>
  </channel>
</rss>

