【问题标题】:Create a sequence of new column names创建一系列新列名
【发布时间】:2014-11-17 11:12:54
【问题描述】:

我有一百左右的列,我想使用以下宏在 SAS 中重命名:

%macro rename1(oldvarlist, newvarlist);
  %let k=1;
  %let old = %scan(&oldvarlist, &k);
  %let new = %scan(&newvarlist, &k);
     %do %while(("&old" NE "") & ("&new" NE ""));
      rename &old = &new;
      %let k = %eval(&k + 1);
      %let old = %scan(&oldvarlist, &k);
      %let new = %scan(&newvarlist, &k);
  %end;
%mend;

这些列当前命名为 C5、C7、C9、...、C205,我想将它们重命名为 AR_0、AR_1、...、AR100。

使用上面的宏,我怎样才能将这些新名称放在以下代码的逗号之后而不用一一编写?

%rename1(C5--C205, # new names here #);

【问题讨论】:

  • 旧的变量名和新的变量名之间会有联系吗?就像 C5 将是 AR_5 还是无论旧的 var 名称是什么,第一个新的 var 名称都会是 AR_0?
  • 不,唯一的联系是它们保持相同的顺序,即 C5 = AR_0、C7 = AR_1 等等。

标签: sas rename columnname


【解决方案1】:

这是一个较长的解决方案,但它是相当动态的,您很容易看到事情是如何运作的。我假设您将在 proc 数据集中使用 rename 语句。否则,您可能只是懒惰并使用数组替换然后删除旧变量,尽管这效率不高。

proc sql;
    create table oldvar as
    select name, varnum
    from sashelp.vcolumn
    where upcase(libname)='SASHELP' 
        and upcase(memname)='CLASS'
    order by varnum;
quit;

data rename;
    set oldvar;
    new_var=catx("_", "AR",varnum);
run;

proc sql noprint;
    select catx("=", name, new_var) into :rename_list 
                    separated by " "
    from rename;
quit;

%put rename &rename_list;

proc datasets library=work;
modify my_dataset;
rename &rename_list;
run;quit;

【讨论】:

  • 非常有用。我现在缺少最后一步,我有一个表“重命名”,其中包含列“名称”(表 Pop09 的当前列名)和“new_var”(表 Pop09 的必需名称) - 我该如何使用重命名表 Pop09 的列?
  • 添加 proc 数据集以进行最终的“重命名”。库是存储数据集的库,my_dataset 是数据集的名称。也不要忘记退出声明 :) 查看论文 Proc Datasets Swiss Army Knife 以获取有关该过程的更多信息。
【解决方案2】:

这将首先找到旧列并将它们重命名为 AR_# 并创建您可以使用的宏变量 varlist:

proc sql noprint;
    create table newvar as
    select name
    from sashelp.vcolumn
    where libname="SASHELP" and memname="CLASS"
    order by name;
quit;
data newvar;
  set newvar;
  name=compress("AR_"!!put(_n_,4.));
run;
proc sql noprint;
    select name into :varlist separated by " " 
    from newvar;
quit;

【讨论】:

    【解决方案3】:

    也许,这样的事情可以完成这项工作

    %macro rename2(oldvarlist, newPrefix);
    %let k=1;
    %let old = %scan(&oldvarlist, &k);
      %do %while(("&old" NE ""));
        rename &old = &newPrefix.&k.;
        %let k = %eval(&k + 1);
        %let old = %scan(&oldvarlist, &k);
      %end;
    %mend;
    

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2021-10-09
      • 2023-04-04
      • 2021-06-25
      相关资源
      最近更新 更多