gpt4 book ai didi

null - 如果 _N_ = 1 条件返回 true,即使在 SAS 中设置的数据集为空(零观察)

转载 作者:行者123 更新时间:2023-12-04 13:55:34 26 4
gpt4 key购买 nike

对 SAS 的疑问:

    data new;
set _NULL_;
run;

data _NULL_;
set new;
if _N_ = 0 then call execute ("%put empty dataset;");
if _N_ = 1 then call execute ("%put non-empty dataset;");
run;

我理解的上述代码应该只打印第一条注释,即空数据集。出于某种原因,尽管它也为第二个 if 条件返回 true 并打印非空数据集。

请让我知道我哪里出错了?

最佳答案

好的,这就是我认为正在发生的事情。第一个问题是您的宏调用是在双引号中,因此在 SAS 甚至开始处理数据步骤之前就被预处理器处理(无论 if 条件是否为真,都会执行)。您需要将要执行的参数放在单引号中而不是双引号中,以防止宏预处理器过早地执行它。

但是,此代码仍然不适用于空数据集,就像设置行上提供的数据集为空一样,在执行任何进一步代码之前,整个数据步骤将终止。

第三,_N_ 被初始化为 1,而不是 0,并在数据步边界上从那里递增,所以 _N_ = 0条件将始终为假。

解决此问题的另一种方法是使用 nobs= 选项进行如下设置:

data _NULL_;
if 0 then set new nobs=num_obs;
if num_obs = 0 then call execute ('%put empty dataset;');
if num_obs > 0 then call execute ('%put non-empty dataset;');
stop;
run;
if 0 then是用于强制执行数据步骤代码的虚拟条件;如果使用了裸 set 语句,则如果数据集“new”为空,则执行将不会继续超过 set 行。

更好的选择可能是使用宏打开数据集并读取 ANY 属性:
%let dsid = %sysfunc (open(dataset_name));
%let anyobs = %sysfunc (attrn(&dsid,ANY));
%let dsid = %sysfunc (close(&dsid));

宏变量 &anyobs如果 dataset_name 包含至少一个观察值(行)和至少一个变量(列),则为 1;如果不包含观察值但至少包含一个变量,则为 0;如果不包含观察值且不包含变量,则为 -1。

关于null - 如果 _N_ = 1 条件返回 true,即使在 SAS 中设置的数据集为空(零观察),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com