【问题标题】:Proc datasets modify several datasets in single stepProc datasets 一步修改多个数据集
【发布时间】:2015-10-27 21:15:37
【问题描述】:

我正在使用以下方法从数据集中删除标签:

proc datasets lib=my_lib memtype=data nolist ;
   modify my_data_1 ; 
     attrib _all_ label=' '; 
run;
quit;

我想对几个数据集 my_data_1,...,my_data_n 执行此操作。使用以下返回错误(期望 ; , /):

proc datasets lib=my_lib memtype=data nolist ;
   modify my_data_1 my_data_2 my_data_3 ;         * and so on ... *;
     attrib _all_ label=' '; 
run;
quit;

我想知道是否有办法对以下情况应用例外:

proc datasets lib=my_lib memtype=data nolist ;
   modify _all_ ;        
   attrib _all_ label=' '; 
run;
quit;

我要修改的数据集占多数,这样会更有效率。

【问题讨论】:

  • 写一个宏对循环有帮助吗?

标签: dataset sas


【解决方案1】:

构建数据集为数据集及其上的变量分配标签;

options mprint;
%macro createThem;
    %do i = 1 %to 3;
        data my_data_&i. (label="Set &i.");
            label j="Set &i.";
            do j = 1 to &i;
                output;
            end;
        run;
    %end;
%mend;
%createThem;

证明成功

proc sql;
    select memname, memlabel from sashelp.vtable 
    where libname='WORK' and memname like 'MY_DATA%'; 
    select memname, name, label from sashelp.vcolumn 
    where libname='WORK' and memname like 'MY_DATA%'; 
run;

编写一个宏来从一个数据集中删除标签;

%macro eraseLabel(data);
    proc datasets lib=WORK memtype=data nolist ;
        modify &data. (label=' ');  ** Remove label form dataset **;
            attrib _all_ label=' '; ** Remove label form variable(s) **;
    run;
    quit;
%mend;

将此宏应用于所涉及的数据集

data _null_;
    set sashelp.vtable;
    where libname='WORK' and memname like 'MY_DATA%';
    call execute('%eraseLabel('||memname||')');
run;

证明成功

proc sql;
    select memname, memlabel from sashelp.vtable 
    where libname='WORK' and memname like 'MY_DATA%';
    select memname, name, label from sashelp.vcolumn 
    where libname='WORK' and memname like 'MY_DATA%';  
run;

【讨论】:

    【解决方案2】:

    更简单的方法是使用复制和选择,例如:

    proc datasets ;
    copy in=sashelp out=work;
    select cars baseball;
    attrib _all_ label=' ';
    run;
    

    【讨论】:

    • 是否可以使用这种方法复制到同一个库中?
    • 是的。如果我的语法正确proc datasets lib=my_lib; copy; select my_data_: ; attrib _all_ label=' '; run; 冒号是通配符。
    • 这比我对小型数据集的回答要好。对于大型数据集,这太耗时了,因为您不仅要编辑数据集的元数据,还要复制完整的内容。
    【解决方案3】:

    这里的另一种方法是构造一个对proc datasets 的调用,这将一次性完成所有操作,在proc 中使用多个run; 组。目标是构建这样的东西:

    data example1 example2;
        set sashelp.class;
        label sex = 'example label';
    run;
    
    proc datasets lib = work nolist;
        modify example1;
        attrib _all_ label = '';
        run;
        modify example2;
        attrib _all_ label = '';
        run;    
    quit;
    

    这可以通过一个相当简单的宏循环或带有调用执行的数据步骤来实现,例如

    data _null_;
        set sashelp.vtable end = eof;
        where libname = 'WORK' and memtype = 'DATA' and memname eq: 'EXAMPLE';
        if _n_ = 1  then call execute('proc datasets lib = work nolist nodetails;');    
                         call execute(catx(' ','modify',memname,'; attrib _all_ label = ""; run;'));
        if eof      then call execute('quit;');
    run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2017-03-03
      相关资源
      最近更新 更多