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;
我需要一种方法来动态 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;