SAS:获取当前数据步骤中的变量数

SAS: Get number of variables in current data step

我需要一种方法来动态 return 当前数据步骤中的变量数量。

使用SAS NOTE 24671: Dynamically determining the number of observations and variables in a SAS data set,我想出了下面的宏。

%macro GetVarCount(dataset);
  /* Open assigns ID to open data set.  Assigns 0 if DNE */
  %let exists = %sysfunc(open(&dataset));

  %if &exists %then
  %do;
    %let returnValue  = %sysfunc(attrn(&exists, nvars));

    %let closed       = %sysfunc(close(&exists));
  %end;
  /* Output error if no dataset */
  %else %put %sysfunc(sysmsg());

  &returnValue
%mend;

不幸的是,由于尚未创建数据集,因此在数据集的初始传递时会出错。在第一遍之后,创建了一个包含 0 个观察值的数据集,宏可以访问 table 和变量数。

例如,

data example;
  input x y;

  put "NOTE: [DEV] There are %GetVarCount(example) variables in the EXAMPLE data set.";

  datalines;
  1 
  2
  ;
run;

第一个 运行 产生:

ERROR: File WORK.EXAMPLE.DATA does not exist.
WARNING: Apparent symbolic reference RETURNVALUE not resolved.

NOTE: [DEV] There are &returnValue variables in the EXAMPLE data set.

第二个 运行 产生:

NOTE: [DEV] There are 2 variables in the EXAMPLE data set.

有没有办法在第一次数据步长为 运行 时获取数据集中变量的数量?

尝试打开已创建的数据集。

'open' 函数需要将打开的数据集存在,我想你希望 'open' 给你一个已经打开的数据集的 ID;事实并非如此。

它仅在第一遍(而不仅仅是第二遍)之后起作用的原因是因为第一遍创建了一个空数据集,其中包含有关其包含的变量的元数据。

首先使用库永久存储您的数据集,然后尝试您的宏从中读取:

    Data <lib>.dataset;

更新:

@Reeza 已经在评论里给你答案了

另一种选择: 使用 put _all_; 会将所有变量打印到日志中,如果您将 put 写入文件然后读取它并计算“=”符号,您也可以获得变量计数。只需从计数中删除 _n_ and _ERROR_

在您的示例中,您试图确定数据步骤中活动变量的数量 - 这不一定与输出数据集中的变量数量相同,因为 (a)可能没有输出数据集,并且 (b) 一些变量可能会被删除。

考虑到这个警告,如果你真的想这样做,那么这个可行:

data fred;
  length x y z $ 20 f g 8;
  array vars_char _character_;
  array vars_num _numeric_;
  total_vars = dim(vars_char) + dim(vars_num);
  put "Vars in data step: " total_vars;
run;

这通过使用特殊的 _character__numeric_ 关键字来创建当前缓冲区中所有字符和数字变量的数组,以及 dim() 函数来获取大小那些数组。

它只会计算声明数组时存在的变量,所以在这种情况下它不会计算total_vars

您可以将其包装在宏中,例如:

%macro var_count(var_count_name):
  array vars_char _character_;
  array vars_num _numeric_;
  &var_count_name = dim(vars_char) + dim(vars_num);
%mend;

然后像这样使用它:

data fred;
  length x y z $ 20 f g 8;
  %var_count(total_vars);
  put "Vars in data step: " total_vars;
run;