【问题标题】:sas add prefix to column namessas 为列名添加前缀
【发布时间】:2014-09-30 14:23:41
【问题描述】:

我需要为表中的某些列名添加前缀。目前的名称范围从_15_49,我只想添加前缀NN_15,...,N_49 等。

我尝试了以下方法:

proc sql noprint;
select cats(name,'=','N',name)
into :prefixlist
separated by ' '
from dictionary.columns
where libname = 'WORK' and memname = 'Freq_nais_2006_2010';
quit;

但是这并没有什么作用,因为我只是在日志输出中收到消息 no rows were selected。我必须改变什么?

【问题讨论】:

  • 这些列名通常是从 PROC TRANSPOSE 创建的,其中添加了下划线,因为不允许使用数字名称。 PROC TRANSPOSE 具有用于添加前缀的内置选项,因此可能值得查看列的创建位置

标签: sas


【解决方案1】:

您的特殊问题是任何行都没有满足 WHERE 子句,可能是因为:and memname = 'Freq_nais_2006_2010'。成员名称通常在 SAS 内部大写,即使它们在您的代码中没有大写。

否则您的代码看起来不错,您应该能够在PROC DATASETS 或数据步骤重命名语句中使用该&prefixlist.。我通常建议使用 PROC SQL 方法,因为它更容易自定义以指定要重命名的变量,但当然,如果您要重命名数据集中的所有变量,宏也可以工作。

【讨论】:

    【解决方案2】:

    你很亲密:

    proc sql noprint;
    select cats(name,'=','N',name)
    into :prefixlist
    separated by ' '
    from dictionary.columns
    where libname = 'WORK' and memname = 'FREQ_NAIS_2006_2010' 
             /* and substr(NAME,1,1) = '_' - can add condition on column name pattern */;
    quit;
    
    proc datasets lib=WORK nolist nodetails;
    modify FREQ_NAIS_2006_2010;
    rename 
    &prefixlist
    ;
    quit;
    

    将分隔符更改为空格,以便在PROC DATASETS; MODIFY ... RENAME ... 语句中使用。 旁注:datastep 变体的答案完全重写了数据集,这对于现实世界的使用(大表)来说是无效和危险的,也不太清楚你在做什么。

    【讨论】:

      【解决方案3】:

      我设法从 sas 网站 (http://support.sas.com/kb/37/433.html) 找到以下代码:

      %macro vars(dsn,chr,out);                                                                                                               
         %let dsid=%sysfunc(open(&dsn));                                                                                                        
         %let n=%sysfunc(attrn(&dsid,nvars));                                                                                                 
         data &out;                                                                                                                            
           set &dsn(rename=(                                                                                                                    
           %do i = 2 %to &n;                                                                                                                 
           %let var=%sysfunc(varname(&dsid,&i));                                                                                            
           &var=&chr&var                                                                                                              
            %end;));                                                                                                                            
            %let rc=%sysfunc(close(&dsid));                                                                                                        
        run;                                                                                                                                  
      %mend vars;
      
      %vars(Freq_nais_2006_2010,N,Freq_nais_2006_2010);
      

      【讨论】:

        【解决方案4】:

        您可以在代码的重命名语句中列出它们,不需要宏或其他任何东西。尽管最好的主意是尽可能避免它。请参阅下面的重命名语句。

        data test;
            array test(20) _1-_20;
            do i=1 to 20;
                test(i)=rand('normal', 20);
            end;
        run;
        
        data test2;
            set test;
            rename _1-_20 = n_1-n_20;
        run;
        

        【讨论】:

          猜你喜欢
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 2016-03-07
          • 1970-01-01
          • 1970-01-01
          • 2011-03-04
          • 2015-12-05
          相关资源
          最近更新 更多