在sas中将标签更改为列名

在sas中将标签更改为列名,sas,Sas,我一直在搜索如何在SAS中将列/变量标签更改为列/变量名称 那么比如说, 现在,我有这样的列/变量名 proc sql noprint; select cats(name,'=', case when label is not null then nliteral(label ) else name end) into: rename separated by ' ' from work.Inst_char8

我一直在搜索如何在SAS中将列/变量标签更改为列/变量名称

那么比如说,

现在,我有这样的列/变量名

  proc sql noprint;
    select cats(name,'=', case when label is not null then nliteral(label ) 
                                else name end) into: rename separated by ' '
    from work.Inst_char8
    where libname='WORK' and memname='Inst_char8';
    quit;


data Inst_char8;
set Inst_char8(rename=(&rename));
run;

然后列/变量标签是这样的

  proc sql noprint;
    select cats(name,'=', case when label is not null then nliteral(label ) 
                                else name end) into: rename separated by ' '
    from work.Inst_char8
    where libname='WORK' and memname='Inst_char8';
    quit;


data Inst_char8;
set Inst_char8(rename=(&rename));
run;

我想将此标签更改为列名

所以我找到了这个解决方案,但我做错了什么

我的数据集名称是work.Inst_char8

我试过了

  proc sql noprint;
    select cats(name,'=', case when label is not null then nliteral(label ) 
                                else name end) into: rename separated by ' '
    from work.Inst_char8
    where libname='WORK' and memname='Inst_char8';
    quit;


data Inst_char8;
set Inst_char8(rename=(&rename));
run;
错误是

在贡献表中未找到以下列:label、libname、memname、name

我知道“重命名”有效,但我有100个变量

如果有办法的话,我可以将列标签切换为列名,除了重命名每100个变量

我很想知道

谢谢

Column Name

INSTNM
IALIAS
ADDR
CITY
STABBR

label

Institution (entity) name
Institution name alias
Street address or post office box
City location of institution
State abbreviation 

只要标签是唯一的,并且可以作为名称使用,那么您的基本方法就可以工作。请注意,名称限制为32字节,标签长度最多为256字节。要将示例中的标签用作名称,需要将VALIDVARNAME选项设置为ANY

options validvarname=any;
但您需要查询具有变量属性的实际元数据表,而不是数据表。请注意,DICTIONARY.COLUMN中的LIBNAME和MEMNAME值始终为大写。此外,您不能将变量重命名为它已有的名称

proc sql noprint;
%let rename=;
select catx('=',nliteral(name),nliteral(substr(coalesce(label,name),1,32)))
  into :rename separated by ' '
from dictionary.columns 
where libname='WORK' and memname='INST_CHAR8'
  and name ne substr(coalesce(label,name),1,32)
;
%let num=&sqlobs ;
quit;
使用PROC数据集更改名称比复制数据更快。但如果重命名列表为空,则会出现错误

%if (&num) %then %do;
proc datasets lib=WORK nolist;
modify INST_CHAR8;
  rename &rename;
run;
quit;
%end;
如果要使用RENAME=dataset选项,则可以使用空列表

data new;
  set INST_CHAR8(rename=(&rename));
run;
如果最终目标是加载到Tableau中,那么您可能只需要写出一个CSV文件。CSV文件没有任何位置来存储数据类型的信息,但Tableau通常会忽略字段的实际数据类型,并尝试根据它看到的值对字段进行分类

proc export data=inst_char8 file='inst_char8.csv' replace dbms=csv label;
run;

你剩下的代码在哪里?您从数据集切换了,需要保留它以查询sashelp.vcolumn数据集,而不是您自己的数据集。数据集名称进入MEMNAME参数,但需要确保大小写正确。这至少会让你更接近,我还没有检查你的所有代码。@Reeza抱歉,我把它添加到了我的代码的其余部分。Proc sql部件已导致错误,如果您不知道解决方案,请告诉我。我的初始响应确实为您提供了答案。您从错误的表中进行查询,
来自inst_char8
-将其更改为原始查询中的内容。这个链接对我不起作用。请花点时间查看答案和表中包含的内容,以便了解查询的作用。为什么要这样做?这可能会使数据集更难使用。@supercoldjkazu我会再次问Tom的问题。你为什么认为你需要这个?