【问题标题】:Running all numeric variables through a macro通过宏运行所有数值变量
【发布时间】:2015-10-14 19:53:01
【问题描述】:
%macro numstats(var = ,file=, format=);
data _null_;
z = find("&var.",'date');
call symput('myeval',z);
run;

%if &myeval. > 0 Or &var. = lpi %then %do;
  Proc SQL;
  create table &var as  
  select "&var." as Varname Length = 35, min(a.&var.) as Minimum FORMAT=&format., max(a.&var.) as Maximum FORMAT=&format., 
  ROUND(avg(a.&var.),.01) as Mean, count(*) as Total_Count,x.Count_Null, y.Count_Zero
  from &file. a
  left join (select "&var." as Var, count(*) as Count_Null from &file.
            where &var = .) x
  on "&var." = x.var
  left join (select "&var." as Var, count(&var.) as Count_Zero from &file.
            where &var  = 0) y
  on "&var." = y.var
  where &var. > 0
  ;
  quit;
  Data &var (rename=(MyNewVar = Minimum MyNewVar2 = Maximum));
  Set &var;
  MyNewVar = Put(Minimum,Date9.);
  MyNewVar2 = Put(Maximum,Date9.);
  *if MyNewVar < 0 then MyNewVar = "";
  *if MyNewVar2 < 0 then MyNewVar2 = "";
  drop Minimum Maximum;
  *format myNewVar yymmddn8. myNewVar2 yymmddn8.;
  run;
%end;
%else %do;
  Proc SQL;
  create table &var as
  select "&var." as Varname Length = 35, min(a.&var.) as Minimum, max(a.&var.) as Maximum, 
  ROUND(avg(a.&var.),.01) as Mean, count(*) as Total_Count,x.Count_Null, y.Count_Zero
  from &file. a
  left join (select "&var." as Var, count(*) as Count_Null from &file.
            where &var = .) x
  on "&var." = x.var
  left join (select "&var." as Var, count(&var.) as Count_Zero from &file.
            where &var  = 0) y
  on "&var." = y.var
  where &var. > 0
  ;
  quit;
  Data &var (rename=(MyNewVar = Minimum MyNewVar2 = Maximum));
  Set &var;
  MyNewVar = Put(Minimum,$12.);
  MyNewVar2 = Put(Maximum,$12.);
  if MyNewVar < 0 then MyNewVar = "";
  if MyNewVar2 < 0 then MyNewVar2 = "";
  drop Minimum Maximum;
  run;
%end;
%mend numstats;

我有一个宏设置,它通过一个预定义的变量 (var) 并检查它是数字还是日期数字,然后相应地格式化使用 SQL 代码生成的统计信息。

代码运行正常。我的问题是数字变量需要一一调出。例如,

%numstats(var = originalprincipalbalance,file=work.filename);.

该文件有许多数字列,并且这些列会不时更改。有没有办法为它设置 SAS 来查找所有数字变量并通过这个宏运行它们,而无需我一个一个地调用它们?

我希望这会大大减少有人必须对每个文件中的所有变量进行错误检查,并确保它们都在自己的代码行上运行。另外,我必须有 70 多行代码,它们本质上是相同的,变量是唯一每次都会改变的东西。

请帮忙!提前谢谢你。

【问题讨论】:

  • SAS 非常擅长使用一个 PROC 分析许多变量。如果您要显示您的输入和所需的输出,我认为有人可以通过几个 PROC 步骤向您展示如何为数据集中的所有 _NUMERIC_ 变量执行您想要的操作,而无需按名称引用变量。
  • 欢迎来到 Stack Overflow。我已经修复了第二个标记,它需要一个空行才能工作。很高兴你分享了你的代码。请分享您的输入和所需的输出。

标签: sas


【解决方案1】:

首先 - 正如 data _null_ 所指出的,这可能是您的问题的一个非常复杂的解决方案; SAS 主要用于其内置工具。使用它们。

也就是说 - 直接提出问题的解决方案相当简单。

您可以从实际上相同的两个来源获取表格中的变量列表。 SASHELP.VCOLUMNdictionary.columns 包含您在各种库名称中拥有的所有表中的变量(“列”)的名称、类型和其他属性(对非 SAS 数据集有一些限制,例如 ODBC 表等)。 dictionary.columnsproc sql 中可用,sashelp.vcolumn 在 SAS 数据步骤中可用(作为视图)。

所以:

proc sql;
  select cats('%numstats(var=',name,',file=filename, format=',format,')')
    into :mcalllist separated by ' '
    from dictionary.columns
    where libname='WORK' and memname='MYDATA' and type='num';
quit;

例如,将创建一个宏变量&amp;mcalllist,其中包含对所有变量的该宏的调用。我不知道您如何定义文件名 - 如果它都相同(并且与源数据集相同),那么您可以对其进行硬编码和/或使用宏变量在 memname 中定义它们(这是数据集名称) 和文件名宏参数中。

【讨论】:

  • 谢谢你,乔!我是 SAS 新手,没想过使用 dictionary.columns 作为查找变量的参考。我能够使用您的代码的轻微变化来运行所有变量并将它们放入宏中。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多