【问题标题】:Proc Sort Using a Macro使用宏进行排序
【发布时间】:2019-08-06 13:52:33
【问题描述】:

我创建了 40 多个表(使用 marco,我刚刚学会了如何操作),我想将 Proc Sort 语句应用于这些表。我希望每个表都按相同的变量“Account_Description”排序(每个表都包含这个变量)。

表名是 June_53410_v1、June_53420_v1、June_53430_v1 等。我可以使用宏吗?如果可以,我该如何减轻必须为每个表编写 proc 排序语句的情况?

谢谢!

我在网上找到了这个示例代码,但我不确定它是如何工作的

 %Macro sorter(dsn, var);
 proc sort data=&dsn.;
 by &var.;
 run;
 %mend;
 %sorter(sample_dataset, age);

【问题讨论】:

  • 我正在阅读这篇文章,并且真的认为您所做的任何事情都可能不应该使用宏,而应该由组处理使用。你知道你可以有多个 BY 变量吗?无论哪种方式,这里都有一个关于将工作程序更改为宏以及如何为所有值运行它的教程,以这种方式创建宏是相当防错的。 github.com/statgeek/SAS-Tutorials/blob/master/…
  • 可能会猜测表结构相同或高度相似,在这种情况下,一个非常有效的方案是将所有数据堆叠在一个数据集中并添加一个或多个列来迁移'数据' month name number version 到单个表中。此时,您可以利用诸如BYCLASSWHERE 之类的 SAS 功能在一个步骤中执行大量分组处理,或对一组选定的“表”执行分组处理
  • 这是一次性任务吗?为什么不直接复制 PROC SORT 步骤 40 次并更改数据集名称?或者,如果您要再次运行原始宏,只需将代码添加到原始宏,以便它以正确的排序顺序生成数据集。
  • 请检查,正确答案

标签: sas


【解决方案1】:

将使用的宏(proc sort write to work)

%Macro sorter(lib,dsn, var);
proc sort data=&lib..&dsn. out=&dsn.;
by &var.;
run;
%mend;

获取名称中包含一些字符的表的字典(可能是“June_”而不是“AIR”)

data sashelp_tables;
set sashelp.vtable;
where LIBNAME="SASHELP" and MEMNAME contains "AIR"
;
run;

将代码写入字符串,并对所有表执行:

data _NULL_;
length code $ 200;
set sashelp_tables;
code=cat('%sorter(',LIBNAME,',',MEMNAME,',AIR);');
call execute(code);
run;

【讨论】:

  • @谢谢!当我运行第二步时,日志显示 SASHELP.VTABLE 中有 0 个观察值,我是否应该将我的所有表(June_53410_v1、June_53420_v1、June_53430_v...)放在此处的 SET 语句中?
  • @Raven Dataset VTABLE 保留所有表的所有 META 信息。根据条件,您只选择您需要的表格。你更正了 LIBNAME 吗?
  • @Raven 是的!将我的条件替换为 where MEMNAME contains "June_"; 。您将看到 table ,其中包含按条件获取的表的元信息(名称、库 ...)。
  • 执行这个:'data sashelp_tables;设置 sashelp.vtable;其中 MEMNAME 包含 "June_" ;运行;'
  • @Raven 那个表在单独的 Libname 中?
【解决方案2】:

感谢大家的意见——我想虽然使用这段代码我找到了答案:

 %macro st (ds);
 proc sort data = &ds;
 by Account_Description;
 run;
 %mend;

 %st(June_53410_v1); 
 %st(June_53420_v1); 

【讨论】:

  • 这比编写 PROC SORT 语句更容易吗?
  • 我不必为我的每一个表都写一个 PROC SORT 语句。
  • 您的编辑器不支持复制粘贴?无论哪种方式,新输入的数量都是相同的。
  • 确实如此,我只是在寻找一种更高效、更简洁的方式来编写代码,上述实现。我不是每次都复制和粘贴 proc 排序步骤,而是键入 %st(table_name1); %st(table_name2);等等
【解决方案3】:

您可以使用此解决方案,其中 lib 是 libname,mask_table 是表的掩码(在您的任务中为 June_),var 是对表进行排序的变量:

 %macro sorter(lib,mask_table, var); %macro d;%mend d;

       %let table_list = 0;

       proc sql noprint;
          select strip(libname) || '.' || strip(memname),count(memname)
          into: table_list separated by ' '
          from dictionary.tables 
          where libname = UPCASE("&lib.") and memname LIKE UPCASE("&mask_table.")||"%";
       quit;

       %do i=1 %to %sysfunc(countw(&table_list,%str( )));
          %let name&i = %scan(&table_list, &i, %str( ));
          proc sort data=&&name&i.;
             by &var.;
          run;
       %end;

  %mend sorter;
  %sorter(WORK,June,Account_Description);

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多