【问题标题】:SAS: Get number of variables in current data stepSAS:获取当前数据步骤中的变量数
【发布时间】:2017-01-12 02:28:44
【问题描述】:

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

使用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 个观测值的数据集,宏可以访问表和变量数。

例如,

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.

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

【问题讨论】:

  • 日志不是已经这样做了吗?如果运行成功,它会输出使用 X 变量和 Y 观测值创建的 Dataset x?我看不出这会如何增加任何东西。此外,在什么阶段,数据步骤可以创建变量,那么您对输入数据集、最终输出数据集或其他内容感兴趣吗?是所有变量都已处理,还是仅在最终数据集中输出。
  • 如果您确实想这样做,一种方法可能是使用 CALL VNEXT,但请注意自动变量已列出,您需要将其过滤掉。 support.sas.com/documentation/cdl/en/lefunctionsref/69762/HTML/…

标签: sas sas-macro datastep


【解决方案1】:

在您的示例中,您尝试确定数据步骤中活动变量的数量 - 这不一定与输出数据集中的变量数量相同,因为 (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;

【讨论】:

    【解决方案2】:

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

    “打开”功能需要将要打开的数据集存在,我认为您希望“打开”为您提供已打开数据集的 ID;事实并非如此。

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

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

        Data <lib>.dataset;
    

    更新:

    @Reeza 已经在 cmets 中给了你答案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多