<?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: Rename columns based on values from other dataset in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798275#M313827</link>
    <description>Holy crap, that's slick &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/78622"&gt;@ghosh&lt;/a&gt;.  Going to have to look at that.</description>
    <pubDate>Wed, 23 Feb 2022 23:31:37 GMT</pubDate>
    <dc:creator>HB</dc:creator>
    <dc:date>2022-02-23T23:31:37Z</dc:date>
    <item>
      <title>Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797901#M313711</link>
      <description>&lt;P&gt;Hi, I have 2 datasets where dataset A contains the column headers and dataset B contains the raw data. Is there an efficient way to change the current (old) column header in dataset B according to the value in dataset A?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;HAVE-Dataset A:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;F1&lt;/TD&gt;&lt;TD&gt;F2&lt;/TD&gt;&lt;TD&gt;F3&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;F1000&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;account_id&lt;/TD&gt;&lt;TD&gt;name&lt;/TD&gt;&lt;TD&gt;age&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;zip_code&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;HAVE-Dataset B:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;F1&lt;/TD&gt;&lt;TD&gt;F2&lt;/TD&gt;&lt;TD&gt;F3&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;F1000&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10000&lt;/TD&gt;&lt;TD&gt;John White&lt;/TD&gt;&lt;TD&gt;34&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;M8DO0U&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10001&lt;/TD&gt;&lt;TD&gt;Amy Power&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;A7DG2E&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;WANT-Dataset B:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;account_id&lt;/TD&gt;&lt;TD&gt;name&lt;/TD&gt;&lt;TD&gt;age&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;zip_code&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10000&lt;/TD&gt;&lt;TD&gt;John White&lt;/TD&gt;&lt;TD&gt;34&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;M8DO0U&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10001&lt;/TD&gt;&lt;TD&gt;Amy Power&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;...&lt;/TD&gt;&lt;TD&gt;A7DG2E&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Feb 2022 21:41:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797901#M313711</guid>
      <dc:creator>newboy1218</dc:creator>
      <dc:date>2022-02-22T21:41:41Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797905#M313715</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data rename;
set datasetA;

array f(1000) f1-f1000;

call execute('proc datasets lib=work; modify datasetB; rename ');

do i=1 to dim(f);
str = catt(vname(f(i)), " = ", f(i));
call execute(str);
end;

call execute(";quit;");

run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Dynamically rename using PROC DATASETS and CALL EXECUTE.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A proc datasets typically looks like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc datasets library=inputLibrary;
modify dataset2change;
rename originalVarName = NewVariableName 
......
.....

list of variables;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Using your first data set you can dynamically create that code by looping through the variables and generating the code and CALL EXECUTE executes the code for you.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Untested but general idea is there for you - if you need help debugging post the exact code and log please.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/211631"&gt;@newboy1218&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Hi, I have 2 datasets where dataset A contains the column headers and dataset B contains the raw data. Is there an efficient way to change the current (old) column header in dataset B according to the value in dataset A?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;HAVE-Dataset A:&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;F1&lt;/TD&gt;
&lt;TD&gt;F2&lt;/TD&gt;
&lt;TD&gt;F3&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;F1000&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;account_id&lt;/TD&gt;
&lt;TD&gt;name&lt;/TD&gt;
&lt;TD&gt;age&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;zip_code&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;HAVE-Dataset B:&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;F1&lt;/TD&gt;
&lt;TD&gt;F2&lt;/TD&gt;
&lt;TD&gt;F3&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;F1000&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10000&lt;/TD&gt;
&lt;TD&gt;John White&lt;/TD&gt;
&lt;TD&gt;34&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;M8DO0U&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10001&lt;/TD&gt;
&lt;TD&gt;Amy Power&lt;/TD&gt;
&lt;TD&gt;12&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;A7DG2E&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;WANT-Dataset B:&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;account_id&lt;/TD&gt;
&lt;TD&gt;name&lt;/TD&gt;
&lt;TD&gt;age&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;zip_code&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10000&lt;/TD&gt;
&lt;TD&gt;John White&lt;/TD&gt;
&lt;TD&gt;34&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;M8DO0U&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10001&lt;/TD&gt;
&lt;TD&gt;Amy Power&lt;/TD&gt;
&lt;TD&gt;12&lt;/TD&gt;
&lt;TD&gt;...&lt;/TD&gt;
&lt;TD&gt;A7DG2E&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Feb 2022 22:17:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797905#M313715</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2022-02-22T22:17:59Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797909#M313718</link>
      <description>&lt;P&gt;If you don't understand/get Reeza's answer (I don't) try this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data headings;
   input f1:$20. f2:$20. f3:$20. f1000:$20.;
datalines;
account_id name age zip_code
;
run;&lt;BR /&gt;

data actualdata;
   input f1:$20. f2 $10. f3:$20. f1000:$20.;
datalines;
10000 John White 34 M8DO0U
10001 Amy Power 12 A7DG2E
;
run; 

*smash the datasets together;
proc datasets;
   append base=headings data=actualdata;
run;

* cheat with a double transpose;
proc transpose data=headings out=wide ;
 var _all_;
run;

proc transpose data=wide(drop=_name_ rename=(col1=_name_)) out=want(drop=_name_ _label_);
   var col:;
   id _name_;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Feb 2022 22:43:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797909#M313718</guid>
      <dc:creator>HB</dc:creator>
      <dc:date>2022-02-22T22:43:19Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797911#M313720</link>
      <description>&lt;P&gt;Take your dataset with the new names and transpose it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input (F1-F3 F1000) (:$32.);
cards;
account_id name age zip_code
;

proc transpose data=have(obs=1) out=names;
  var _all_;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now you instead of a dataset with 1 observation and N variables you one with N observations and 2 variables, _NAME_ and COL1.&lt;/P&gt;
&lt;P&gt;So use that to generate the OLD=NEW pairs needed by the RENAME statement.&lt;/P&gt;
&lt;P&gt;Let's create a text file with the RENAME statement in it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;filename rename temp;
data _null_;
  set names end=eof;
  length old new $51 ;
  old=nliteral(_name_);
  new=nliteral(col1);
  file rename ;
  if _n_=1 then put 'rename';
  put old '=' new ;
  if eof then put ';' ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now we can use %INCLUDE to add the RENAME statement to our code.&lt;/P&gt;
&lt;P&gt;So if you wanted to make new dataset named NEW that is a copy of the existing dataset named B with the new names you would use.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data new;
  set b;
%include rename / source2;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If you wanted to just modify B then use PROC DATASETS instead&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc datasets lib=WORK nolist;
  modify b; 
%include rename / source2;
  run;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 22 Feb 2022 22:57:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797911#M313720</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-02-22T22:57:09Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797912#M313721</link>
      <description>&lt;P&gt;My approach doesn't modify the data set at all, it just renames the data making more efficient but the best solution is always one you understand and can modify.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;General idea is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;data driven code - as data set changes it changes&lt;/LI&gt;
&lt;LI&gt;PROC DATASETS will rename variables in a data set by modifying the metadata rather than re-creating the data set. For large data sets this is much more efficient.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Create an array to reference all the variables&lt;/LI&gt;
&lt;LI&gt;Use VNAME to get the variable current/old name from the array&lt;/LI&gt;
&lt;LI&gt;Use the value of the array as the new name&lt;/LI&gt;
&lt;LI&gt;Create a string that has the format of oldName = newName to pass to proc datasets&lt;/LI&gt;
&lt;LI&gt;Use CALL EXECUTE to run the generated code&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data headings;
   input f1:$20. f2:$20. f3:$20. f1000:$20.;
datalines;
account_id name age zip_code
;
run;

data actualdata;
   input f1:$20. f2 $10. f3:$20. f1000:$20.;
datalines;
10000 John White 34 M8DO0U
10001 Amy Power 12 A7DG2E
;
run; 


data rename;
set headings;

array f(*) f:;;
&lt;BR /&gt;*start proc datasets process to update data set;
call execute('proc datasets lib=work; modify actualdata; rename ');

do i=1 to dim(f);
str = catt(vname(f(i)), " = ", f(i));
call execute(str);
end;

call execute(";quit;");

run;

proc contents data=actualdata;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Log (selected) is generated from the data step dynamically it creates this text that is then executed via SAS:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; NOTE: CALL EXECUTE generated line.
 1        &lt;FONT color="#FF0000"&gt;&lt;STRONG&gt; + proc datasets lib=work;
 1         +                         modify actualdata;
 1         +                                            rename
 2         + f1 =account_id    
 3         + f2 =name
 4         + f3 =age
 5         + f1000 =zip_code
 6         + ;&lt;/STRONG&gt;&lt;/FONT&gt;
 NOTE: Renaming variable f1 to account_id.
 NOTE: Renaming variable f2 to name.
 NOTE: Renaming variable f3 to age.
 NOTE: Renaming variable f1000 to zip_code.
 6         +  quit;
 
 NOTE: MODIFY was successful for WORK.ACTUALDATA.DATA.
 NOTE: PROCEDURE DATASETS used (Total process time):
       real time           0.03 seconds
       user cpu time       0.04 seconds
       system cpu time     0.00 seconds
       memory              1421.31k
       OS Memory           29612.00k
       Timestamp           02/22/2022 10:52:29 PM
       Step Count                        37  Switch Count  0
       Page Faults                       0
       Page Reclaims                     130
       Page Swaps                        0
       Voluntary Context Switches        0
       Involuntary Context Switches      0
       Block Input Operations            0
       Block Output Operations           272
       &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;FYI - code in this post is modified slightly to be more dynamic and account for varying amounts of variables (F variables).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Feb 2022 23:00:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/797912#M313721</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2022-02-22T23:00:32Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798129#M313792</link>
      <description>&lt;P&gt;How did you read that data into SAS in the first place?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The appearance for both data sets is odd, at least to me. If you were using a data step to read the information then you need to think ahead a bit more in the code. If using Proc Import I have a hard time seeing where you get sequentially numbered F variables, at least from most sources.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are going to have multiple data sets of the same structure I would address the reading step to avoid later "fixes".&lt;/P&gt;</description>
      <pubDate>Wed, 23 Feb 2022 17:29:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798129#M313792</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2022-02-23T17:29:51Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798234#M313814</link>
      <description>&lt;P&gt;Could do it with proc IML.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To use mixed data types in a matrix you would need&amp;nbsp;&lt;SPAN&gt;SAS/IML 15.1 that was released as part of SAS 9.4m6.&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data headings;
	input f1:$20. f2:$20. f3:$20. f1000:$20.;
	datalines;
account_id name age zip_code
;

data actualdata;
	input f1:$20. f2 $10. f3:$20. f1000:$20.;
	datalines;
10000 John White 34 M8DO0U
10001 Amy Power 12 A7DG2E
;

proc iml;
	use headings;
	read all var _CHAR_ into varNames;
	close headings;
	
	use actualdata;
	read all var _ALL_ into mat;	 
	close actualdata;
	
	print varNames, mat;
	create want from mat [colname=varNames];
	append from mat;
	close;
	quit;

proc print data=want;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ghosh_0-1645647407695.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/68786i48FF80432219612A/image-size/medium?v=v2&amp;amp;px=400" role="button" title="ghosh_0-1645647407695.png" alt="ghosh_0-1645647407695.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 23 Feb 2022 20:24:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798234#M313814</guid>
      <dc:creator>ghosh</dc:creator>
      <dc:date>2022-02-23T20:24:06Z</dc:date>
    </item>
    <item>
      <title>Re: Rename columns based on values from other dataset</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798275#M313827</link>
      <description>Holy crap, that's slick &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/78622"&gt;@ghosh&lt;/a&gt;.  Going to have to look at that.</description>
      <pubDate>Wed, 23 Feb 2022 23:31:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rename-columns-based-on-values-from-other-dataset/m-p/798275#M313827</guid>
      <dc:creator>HB</dc:creator>
      <dc:date>2022-02-23T23:31:37Z</dc:date>
    </item>
  </channel>
</rss>

