Help using Base SAS procedures

PROC TABULATE in 9.4 M3 changes var name

Occasional Contributor
Posts: 12

PROC TABULATE in 9.4 M3 changes var name

So I ran this little piece of code under SAS9.4 M0 and also under M3 and get a different name for the colpctsum variable!


proc tabulate out=fred;

   var horsepower;

   class origin;

   table origin,horsepower*colpctsum;



Under M0 the var name is: Horsepower_PctSum_0

Under M3 the var name is: Horsepower_PctSum_0_Horsepower


This is very unfortunate and is causing us a lot of grief!


Is there anything in the release notes that refers to this new behaviour?




Super User
Posts: 23,700

Re: PROC TABULATE in 9.4 M3 changes var name

I would definitely contact tech support with this question, if you haven't already. 

New Contributor
Posts: 2

Re: PROC TABULATE in 9.4 M3 changes var name

We just upgraded from 9.4M2 to 9.4M4 and experienced the same column naming issue when using PROC TABULATE between versions.


I know it has been a long time since this post was created but did you find anything out from tech support?

Community Manager
Posts: 3,424

Re: PROC TABULATE in 9.4 M3 changes var name

[ Edited ]

Here's a SAS note that describes the change.  It was intentional -- to help with name collisions.  But unfortunately it broke your process.


More documentation/explanation in this Usage Note 45710: Naming convention for statistics in an output data set created by PROC TAB....


Here is a brute-force SAS macro program -- which I dug out of a Tech Support track and which you should definitely test before using in production -- that renames the variables back to the old style, trimming the underscore-number suffix.


%macro myrename(dsn=&syslast);
  %let lib=%scan(&syslast,1,%str(.));
  %let mem=%scan(&syslast,2,%str(.));
  proc sql  noprint;
  /* generate a command line : RENAME oldname=newname */
   select catt('rename',' '!!name,'=',substr(name,1,length(name)-index(reverse(trim(name)),'_'))) into:renamelist separated by ";"
   from sashelp.vcolumn where libname=upcase("&lib.") and memname=upcase("&mem.") and (lowcase(name) like '%_pctsum_%' OR lowcase(name) like '%_pctn_%' );
  /* execute this command in proc datasets */
  proc datasets lib=&lib nolist;    modify &mem;    &renamelist;  run;quit;
%mend myrename;
Ask a Question
Discussion stats
  • 3 replies
  • 4 in conversation