如何从SAS中的多个标签中删除公共前缀?

时间:2017-03-23 10:34:27

标签: sas

所以我有数百个变量,其中一些标有公共前缀" P0 - "。我没有手动从每个标签中删除这个前缀,而是尝试了各种SQL和宏函数而没有任何运气(我在新手上谈到了SQL)。任何帮助产生正确的语法都将受到高度赞赏!

语法失败:

proc sql noprint;
  select catx(' ', label,'=',tranwrd(label,'P0 - ',''))
    into :rcode separated by ' ' 
  from dictionary.columns 
  where libname='WORK' and memname='DSET'
; 
quit ; 
%put &rcode ; 

proc datasets library=work ;
  modify dset ;
  attrib _all_ label= &rcode; 
run;

2 个答案:

答案 0 :(得分:3)

您沿着正确的方向行驶,但代码中存在一些错误。首先,您需要将标签分配给列,而不是重命名标签。在dictionary.columns这是name变量(即宏应存储name = new_label而不是label = new_label)。

其次,您不需要attrib中的关键字allproc datasets。在数据步骤中使用attrib来分配属性,并且在要将所有变量应用于同一标签的地方使用all,最常见的是将它们全部设置为缺失。正确的语法(一旦您放入modify语句)是label column1 = label1 column2 = label2等。

尝试使用以下代码,虽然我还没有对其进行全面测试,但这应该可行。我在第一步中为where子句添加了另一个声明,只包含标签以' PO - '开头的列,因为它看起来像你不是想要改变任何其他人。

proc sql noprint; 
select 
    catx(' ', name,'=',tranwrd(label,'P0 - ','')) 
into: 
    rcode separated by ' ' 
from 
    dictionary.columns 
where 
    libname='WORK' 
    and 
    memname='DSET'
    and
    label eqt 'P0 - '; 
quit ; 

%put &rcode ; 

proc datasets library=work ; 
modify dset ;
    label &rcode; 
quit;

答案 1 :(得分:0)

我修改了你的代码,它适用于模拟数据。标签值应封装在括号中。我使用了column_name =" new label"在proc数据集中。

data DSET;
    length A B C 3;
    label 
        A = 'P0 - A'
        B = 'P0 - B'
        C = 'P0 - C'
    ;
run;

proc sql noprint;
    select cat(strip(name), '=', '"', strip(tranwrd(label, 'P0 - ','')), '"') 
        into: rcode separated by ' ' 
    from dictionary.columns where libname='WORK' and memname='DSET';
quit;

%put &rcode;

proc datasets library=work;
    modify dset;
    label
        &rcode
    ;
run;