<?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: Appending standardized fields in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71476#M20635</link>
    <description>This version address the variable order issue.  The standardized versions of the variables are woven into the original variables immediately following the unstandardized version of the variables.&lt;BR /&gt;
&lt;BR /&gt;
This program could be made completly dynamic with a few more parameters say in a macro to specify input and output datasets, std variable list, and merge key. I suppose the merge key could be omitted if you wanted use One-to-One Merging.&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
data score;&lt;BR /&gt;
   length Student $ 9;&lt;BR /&gt;
   input Student $ StudentNumber Section $&lt;BR /&gt;
         Test1 Test2 Final @@;&lt;BR /&gt;
   format studentnumber z4.;&lt;BR /&gt;
   datalines;&lt;BR /&gt;
Capalleti 0545 1 94 91 87  Dubose    1252 2 51 65 91&lt;BR /&gt;
Engles    1167 1 95 97 97  Grant     1230 2 63 75 80&lt;BR /&gt;
Krupski   2527 2 80 69 71  Lundsford 4860 1 92 40 86&lt;BR /&gt;
McBane    0674 1 75 78 72  Mullen    6445 2 89 82 93&lt;BR /&gt;
Nguyen    0886 1 79 76 80  Patel     9164 2 71 77 83&lt;BR /&gt;
Si        4915 1 75 71 73  Tanaka    8534 2 87 73 76&lt;BR /&gt;
;;;;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc sort;&lt;BR /&gt;
   by studentNumber; &lt;BR /&gt;
   run;&lt;BR /&gt;
*** Get variable to score into a SAS data set;&lt;BR /&gt;
proc transpose data=score(obs=0) out=stdvars(index=(_name_));&lt;BR /&gt;
   var test1-test2;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Get _ALL_ variable names into a SAS data set;&lt;BR /&gt;
proc transpose data=score(obs=0) out=allvars;&lt;BR /&gt;
   var _all_;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Weave all vars with STDvar names, to use in retain statement;&lt;BR /&gt;
data weaveSTDvars;&lt;BR /&gt;
   length _name_ $32;&lt;BR /&gt;
   set allvars(in=in1);&lt;BR /&gt;
   output;&lt;BR /&gt;
   set stdvars key=_name_/unique;&lt;BR /&gt;
   if _iorc_ eq 0 then do;&lt;BR /&gt;
      _name_ = cats('Std',_name_);&lt;BR /&gt;
      output;&lt;BR /&gt;
      end;&lt;BR /&gt;
   else _error_=0;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc print;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Gen some code RENAME option and varlist;&lt;BR /&gt;
%let RenameOpt=;&lt;BR /&gt;
%let varlist=;&lt;BR /&gt;
%let NewVariableOrder=;&lt;BR /&gt;
proc sql noprint; &lt;BR /&gt;
   select &lt;BR /&gt;
      catx('=',_name_,cats('Std',_name_)),&lt;BR /&gt;
      _name_&lt;BR /&gt;
      into :RenameOpt separated by ' ', &lt;BR /&gt;
           :VarList separated by ' '      &lt;BR /&gt;
      from stdvars&lt;BR /&gt;
   ;&lt;BR /&gt;
   select _name_ into :newVariableOrder separated by ' '&lt;BR /&gt;
      from weaveSTDvars;&lt;BR /&gt;
   quit;&lt;BR /&gt;
   run;&lt;BR /&gt;
%put NOTE: RenameOpt=&amp;amp;RenameOpt;&lt;BR /&gt;
%put NOTE: Varlist=&amp;amp;varList;&lt;BR /&gt;
%put NOTE: NewVariableOrder=&amp;amp;NewVariableOrder;&lt;BR /&gt;
proc standard &lt;BR /&gt;
      data  =  score&lt;BR /&gt;
         (&lt;BR /&gt;
            keep     =  studentnumber &amp;amp;VarList&lt;BR /&gt;
            rename   =  (&amp;amp;renameOpt)&lt;BR /&gt;
         )&lt;BR /&gt;
      mean=75 std=5 out=stndtest;&lt;BR /&gt;
   var Std:;&lt;BR /&gt;
   run;&lt;BR /&gt;
data work.Combined;&lt;BR /&gt;
   retain &amp;amp;NewVariableOrder;&lt;BR /&gt;
   merge score stndtest;&lt;BR /&gt;
   by studentNumber;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc print data=combined noobs round;&lt;BR /&gt;
   title 'Standardized Test Scores for a College Course';&lt;BR /&gt;
   run;&lt;BR /&gt;
[/pre]</description>
    <pubDate>Wed, 28 Jan 2009 16:54:04 GMT</pubDate>
    <dc:creator>data_null__</dc:creator>
    <dc:date>2009-01-28T16:54:04Z</dc:date>
    <item>
      <title>Appending standardized fields</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71474#M20633</link>
      <description>THe SAS help file gives the following example of creating standardized fields with &lt;I&gt;proc standard&lt;/I&gt; and then appending them onto the original dataset with &lt;I&gt;proc sql&lt;/I&gt;:&lt;BR /&gt;
&lt;BR /&gt;
&lt;I&gt;proc standard data=score mean=75 std=5 out=stndtest; &lt;BR /&gt;
     var test1 test2;&lt;BR /&gt;
run; &lt;BR /&gt;
  proc sql;&lt;BR /&gt;
   create table combined as&lt;BR /&gt;
   select old.student, old.studentnumber,&lt;BR /&gt;
          old.section,&lt;BR /&gt;
          old.test1, new.test1 as StdTest1,&lt;BR /&gt;
          old.test2, new.test2 as StdTest2,&lt;BR /&gt;
          old.final&lt;BR /&gt;
   from score as old, stndtest as new&lt;BR /&gt;
   where old.student=new.student;&lt;/I&gt;&lt;BR /&gt;
&lt;BR /&gt;
Anyone know of an easier way to get the standardized fields appended onto the original dataset?  The problem is if i have 20 fields then I have to hand-code the sql statement.&lt;BR /&gt;
&lt;BR /&gt;
Is there a way to either:&lt;BR /&gt;
&lt;BR /&gt;
- tell proc standard to append the fields onto the original dataset (like proc princomp)&lt;BR /&gt;
&lt;BR /&gt;
- Maybe an example of referencing (and rename) fields in proc sql using the "--" operator??&lt;BR /&gt;
&lt;BR /&gt;
Any help would be greatly appreciated - thank you!</description>
      <pubDate>Wed, 28 Jan 2009 13:05:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71474#M20633</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2009-01-28T13:05:12Z</dc:date>
    </item>
    <item>
      <title>Re: Appending standardized fields</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71475#M20634</link>
      <description>this address the following issues&lt;BR /&gt;
&lt;BR /&gt;
1) variable list of unknown length&lt;BR /&gt;
2) create new variable with prefix STD&lt;BR /&gt;
3) combine with original(requires merge key)&lt;BR /&gt;
&lt;BR /&gt;
It does not create the variable order that was achieved with proc sql but that could be address if desired.&lt;BR /&gt;
&lt;BR /&gt;
[Pre]&lt;BR /&gt;
data score;&lt;BR /&gt;
   length Student $ 9;&lt;BR /&gt;
   input Student $ StudentNumber Section $&lt;BR /&gt;
         Test1 Test2 Final @@;&lt;BR /&gt;
   format studentnumber z4.;&lt;BR /&gt;
   datalines;&lt;BR /&gt;
Capalleti 0545 1 94 91 87  Dubose    1252 2 51 65 91&lt;BR /&gt;
Engles    1167 1 95 97 97  Grant     1230 2 63 75 80&lt;BR /&gt;
Krupski   2527 2 80 69 71  Lundsford 4860 1 92 40 86&lt;BR /&gt;
McBane    0674 1 75 78 72  Mullen    6445 2 89 82 93&lt;BR /&gt;
Nguyen    0886 1 79 76 80  Patel     9164 2 71 77 83&lt;BR /&gt;
Si        4915 1 75 71 73  Tanaka    8534 2 87 73 76&lt;BR /&gt;
;;;;&lt;BR /&gt;
&lt;BR /&gt;
   run;&lt;BR /&gt;
proc sort;&lt;BR /&gt;
   by studentNumber; &lt;BR /&gt;
   run;&lt;BR /&gt;
*** Get variables list into SAS data set;&lt;BR /&gt;
proc transpose data=score(obs=0) out=varlist;&lt;BR /&gt;
   var test1-test2;&lt;BR /&gt;
   run;&lt;BR /&gt;
&lt;BR /&gt;
*** Gen some code RENAME option and varlist;&lt;BR /&gt;
%let RenameOpt=;&lt;BR /&gt;
proc sql; &lt;BR /&gt;
   select &lt;BR /&gt;
      catx('=',_name_,cats('Std',_name_)),&lt;BR /&gt;
      _name_&lt;BR /&gt;
      into :RenameOpt separated by ' ', &lt;BR /&gt;
           :VarList separated by ' '      &lt;BR /&gt;
      from varlist&lt;BR /&gt;
   ;&lt;BR /&gt;
   quit;&lt;BR /&gt;
   run;&lt;BR /&gt;
%put NOTE: RenameOpt=&amp;amp;RenameOpt;&lt;BR /&gt;
%put NOTE: Varlist=&amp;amp;varList;&lt;BR /&gt;
&lt;BR /&gt;
proc standard &lt;BR /&gt;
      data  =  score&lt;BR /&gt;
         (&lt;BR /&gt;
            keep     =  studentnumber &amp;amp;VarList&lt;BR /&gt;
            rename   =  (&amp;amp;renameOpt)&lt;BR /&gt;
         )&lt;BR /&gt;
      mean=75 std=5 out=stndtest;&lt;BR /&gt;
   var Std:;&lt;BR /&gt;
   run;&lt;BR /&gt;
data work.Combined;&lt;BR /&gt;
   merge score stndtest;&lt;BR /&gt;
   by studentNumber;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc print data=combined noobs round;&lt;BR /&gt;
   title 'Standardized Test Scores for a College Course';&lt;BR /&gt;
   run;&lt;BR /&gt;
[/pre]</description>
      <pubDate>Wed, 28 Jan 2009 14:04:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71475#M20634</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2009-01-28T14:04:16Z</dc:date>
    </item>
    <item>
      <title>Re: Appending standardized fields</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71476#M20635</link>
      <description>This version address the variable order issue.  The standardized versions of the variables are woven into the original variables immediately following the unstandardized version of the variables.&lt;BR /&gt;
&lt;BR /&gt;
This program could be made completly dynamic with a few more parameters say in a macro to specify input and output datasets, std variable list, and merge key. I suppose the merge key could be omitted if you wanted use One-to-One Merging.&lt;BR /&gt;
&lt;BR /&gt;
[pre]&lt;BR /&gt;
data score;&lt;BR /&gt;
   length Student $ 9;&lt;BR /&gt;
   input Student $ StudentNumber Section $&lt;BR /&gt;
         Test1 Test2 Final @@;&lt;BR /&gt;
   format studentnumber z4.;&lt;BR /&gt;
   datalines;&lt;BR /&gt;
Capalleti 0545 1 94 91 87  Dubose    1252 2 51 65 91&lt;BR /&gt;
Engles    1167 1 95 97 97  Grant     1230 2 63 75 80&lt;BR /&gt;
Krupski   2527 2 80 69 71  Lundsford 4860 1 92 40 86&lt;BR /&gt;
McBane    0674 1 75 78 72  Mullen    6445 2 89 82 93&lt;BR /&gt;
Nguyen    0886 1 79 76 80  Patel     9164 2 71 77 83&lt;BR /&gt;
Si        4915 1 75 71 73  Tanaka    8534 2 87 73 76&lt;BR /&gt;
;;;;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc sort;&lt;BR /&gt;
   by studentNumber; &lt;BR /&gt;
   run;&lt;BR /&gt;
*** Get variable to score into a SAS data set;&lt;BR /&gt;
proc transpose data=score(obs=0) out=stdvars(index=(_name_));&lt;BR /&gt;
   var test1-test2;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Get _ALL_ variable names into a SAS data set;&lt;BR /&gt;
proc transpose data=score(obs=0) out=allvars;&lt;BR /&gt;
   var _all_;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Weave all vars with STDvar names, to use in retain statement;&lt;BR /&gt;
data weaveSTDvars;&lt;BR /&gt;
   length _name_ $32;&lt;BR /&gt;
   set allvars(in=in1);&lt;BR /&gt;
   output;&lt;BR /&gt;
   set stdvars key=_name_/unique;&lt;BR /&gt;
   if _iorc_ eq 0 then do;&lt;BR /&gt;
      _name_ = cats('Std',_name_);&lt;BR /&gt;
      output;&lt;BR /&gt;
      end;&lt;BR /&gt;
   else _error_=0;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc print;&lt;BR /&gt;
   run;&lt;BR /&gt;
*** Gen some code RENAME option and varlist;&lt;BR /&gt;
%let RenameOpt=;&lt;BR /&gt;
%let varlist=;&lt;BR /&gt;
%let NewVariableOrder=;&lt;BR /&gt;
proc sql noprint; &lt;BR /&gt;
   select &lt;BR /&gt;
      catx('=',_name_,cats('Std',_name_)),&lt;BR /&gt;
      _name_&lt;BR /&gt;
      into :RenameOpt separated by ' ', &lt;BR /&gt;
           :VarList separated by ' '      &lt;BR /&gt;
      from stdvars&lt;BR /&gt;
   ;&lt;BR /&gt;
   select _name_ into :newVariableOrder separated by ' '&lt;BR /&gt;
      from weaveSTDvars;&lt;BR /&gt;
   quit;&lt;BR /&gt;
   run;&lt;BR /&gt;
%put NOTE: RenameOpt=&amp;amp;RenameOpt;&lt;BR /&gt;
%put NOTE: Varlist=&amp;amp;varList;&lt;BR /&gt;
%put NOTE: NewVariableOrder=&amp;amp;NewVariableOrder;&lt;BR /&gt;
proc standard &lt;BR /&gt;
      data  =  score&lt;BR /&gt;
         (&lt;BR /&gt;
            keep     =  studentnumber &amp;amp;VarList&lt;BR /&gt;
            rename   =  (&amp;amp;renameOpt)&lt;BR /&gt;
         )&lt;BR /&gt;
      mean=75 std=5 out=stndtest;&lt;BR /&gt;
   var Std:;&lt;BR /&gt;
   run;&lt;BR /&gt;
data work.Combined;&lt;BR /&gt;
   retain &amp;amp;NewVariableOrder;&lt;BR /&gt;
   merge score stndtest;&lt;BR /&gt;
   by studentNumber;&lt;BR /&gt;
   run;&lt;BR /&gt;
proc print data=combined noobs round;&lt;BR /&gt;
   title 'Standardized Test Scores for a College Course';&lt;BR /&gt;
   run;&lt;BR /&gt;
[/pre]</description>
      <pubDate>Wed, 28 Jan 2009 16:54:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71476#M20635</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2009-01-28T16:54:04Z</dc:date>
    </item>
    <item>
      <title>Re: Appending standardized fields</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71477#M20636</link>
      <description>There's a lot of great techniques here - thanks!</description>
      <pubDate>Wed, 28 Jan 2009 18:27:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Appending-standardized-fields/m-p/71477#M20636</guid>
      <dc:creator>deleted_user</dc:creator>
      <dc:date>2009-01-28T18:27:04Z</dc:date>
    </item>
  </channel>
</rss>

