【问题标题】:Rename all variable sas重命名所有变量 sas
【发布时间】:2019-12-01 04:32:57
【问题描述】:

我有一个数据库,其中 12,000 个变量被命名为“A0122_40”、“A0122_45”、“A0122_50”等等。我想通过在初始名称中保留从 2 到 5 的数字来重命名它们。然后我想创建变量,添加所有具有相同名称的列。

【问题讨论】:

  • 您是否尝试使用dictionary.columns?
  • 是否要附加所有前缀为“a122”的列?
  • 我不明白。您想用它们的值的总和替换示例中的三个变量吗? A0122=sum(of A0122_:); drop A0122_:;
  • 你试过什么?你能发布一些示例代码,比如只有 5 个变量(而不是 12,000 个)吗?

标签: sas rename


【解决方案1】:

这是你要找的吗:

proc contents data=have out=cols noprint;
run;

proc sql noprint;
  select distinct substr(name,1,6) into :colgrps separated by " " from cols;
run;

%macro process;

data want;
  set have;
  %let ii = 1;

  %do %while (%scan(&colgrps, &ii, %str( )) ~= );
    %let grp = %scan(&colgrps, &ii, %str( ));
    &grp._sum = sum(of &grp.:);
    %let ii = %eval(&ii + 1);
  %end;

run;
%mend;

%process;

【讨论】:

    【解决方案2】:

    案例 1

    如果你想连接两个具有相同列名的表,并保留所有数据:

    data class;
    set sashelp.class (obs=2);
    rename name=A0122_40
        Sex=A0122_45
        Weight=A0122_50
        Height=A0122_55
    
    ;run;
    

    准备好的表格:

    +----------+----------+-----+----------+----------+
    | A0122_40 | A0122_45 | Age | A0122_55 | A0122_50 |
    +----------+----------+-----+----------+----------+
    | Alfred   | M        |  14 |       69 |    112.5 |
    | Alice    | F        |  13 |     56.5 |       84 |
    +----------+----------+-----+----------+----------+
    

    重命名代码:

    %macro renameCols(lb , ds);
    proc sql noprint;
        select name
            into :rn_vr1-
                from dictionary.columns
                    where LIBNAME=upcase("&lb") AND MEMNAME=upcase("&ds")
                        AND NAME LIKE 'A0122%'
        ;
        %let num_vars = &sqlobs.;
    
    proc datasets library=&lb nolist nodetails nowarn;
        modify &ds;
        rename
    
            %do i=1 %to &num_vars;
                &&rn_vr&i=new_&&rn_vr&i
            %end;
        ;
    %mend renameCols;
    %renameCols(work,class);
    

    结果表:

    +--------------+--------------+-----+--------------+--------------+
    | new_A0122_40 | new_A0122_45 | Age | new_A0122_55 | new_A0122_50 |
    +--------------+--------------+-----+--------------+--------------+
    | Alfred       | M            |  14 |           69 |        112.5 |
    | Alice        | F            |  13 |         56.5 |           84 |
    +--------------+--------------+-----+--------------+--------------+
    

    如您所见,所有列都已重命名,不包括 Age。


    案例 2

    如果您想将所有 A0122_...“附加”在一个中,我建议使用下一个代码:

    data class;
        set sashelp.class (obs=2);
        rename name=A0123_40
            Sex=A0123_45
            Weight=A0122_50
            Height=A0121_55
    
        ;
    run;
    

    准备好的表格:

    +----------+----------+-----+----------+----------+
    | A0123_40 | A0123_45 | Age | A0121_55 | A0122_50 |
    +----------+----------+-----+----------+----------+
    | Alfred   | M        |  14 |       69 |    112.5 |
    | Alice    | F        |  13 |     56.5 |       84 |
    +----------+----------+-----+----------+----------+
    

    重命名代码:

    %macro renameCols(lb , ds);
    
    %macro d;
    %mend d;
    
        proc sql noprint;
        select name
            into :rn_vr1-
                from dictionary.columns
                    where LIBNAME=upcase("&lb") AND MEMNAME=upcase("&ds")
                        AND NAME LIKE 'A012%'
        ;
        %let num_vars = &sqlobs.;
    
        /*Create a lot of tables with one column from one input*/
        data 
        %do i=1 %to &num_vars;
            &&rn_vr&i (rename=(&&rn_vr&i=%scan(&&rn_vr&i,1,_)) keep = &&rn_vr&i )
        %end;
        ;
        set &lb..&ds.;
        run;
    
        /*Count variable patterns and write it to macro*/
        proc sql noprint;
            select distinct scan(name,1,'_')
                into :aggr_vars1-
                    from dictionary.columns
                        where LIBNAME=upcase("&lb") AND MEMNAME=upcase("&ds")
                            AND NAME LIKE 'A012%'
        ;
        %let num_aggr_vars=&sqlobs.;
    
        /*Append all tables that contains same column name pattern*/
        %do i=1 %to &num_aggr_vars;
            data _&&aggr_vars&i;
                set &&aggr_vars&i:;
                n=_n_;
            run;
        %end;
    
        /*Merge that tables into one*/
        data res (drop= n);
            merge 
                %do i=1 %to &num_aggr_vars;
            _&&aggr_vars&i
            %end;
            ;
            by n;
        run;
    
        run;
    
    %mend renameCols;
    
    %renameCols(work,class);
    

    资源表:

    +-------+-------+--------+
    | A0121 | A0122 | A0123  |
    +-------+-------+--------+
    |    69 | 112.5 | Alfred |
    |  56.5 |    84 | Alice  |
    |     . |     . | M      |
    |     . |     . | F      |
    +-------+-------+--------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多