有条件地保留 SAS 中的变量

发布于 2024-10-14 13:22:10 字数 523 浏览 13 评论 0原文

我有这个 SAS 示例代码:

data BEFORE;
    input v1 v2;
datalines;
1 2
;

data AFTER;
    put 'Before IF: ' _ALL_;
    if _N_ = 1 then set BEFORE;
    put 'After  IF : ' _ALL_;
run;

输出为:

BEFORE: v1=. v2=. _ERROR_=0 _N_=1
AFTER : v1=1 v2=2 _ERROR_=0 _N_=1
BEFORE: v1=1 v2=2 _ERROR_=0 _N_=2
AFTER : v1=1 v2=2 _ERROR_=0 _N_=2

输出文件包含:

Obs    v1    v2
1      1     2
2      1     2

我知道 SET 将导入并保留 BEFORE 数据集的变量,但为什么 BEFORE 的记录会重复?

I have this SAS sample code:

data BEFORE;
    input v1 v2;
datalines;
1 2
;

data AFTER;
    put 'Before IF: ' _ALL_;
    if _N_ = 1 then set BEFORE;
    put 'After  IF : ' _ALL_;
run;

The output is:

BEFORE: v1=. v2=. _ERROR_=0 _N_=1
AFTER : v1=1 v2=2 _ERROR_=0 _N_=1
BEFORE: v1=1 v2=2 _ERROR_=0 _N_=2
AFTER : v1=1 v2=2 _ERROR_=0 _N_=2

And the output file contains:

Obs    v1    v2
1      1     2
2      1     2

I know that the SET will import and RETAIN the BEFORE dataset's variables, but why BEFORE's record gets duplicated?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吻安 2024-10-21 13:22:10

我运行了您的示例代码,并且您省略了一条关键信息:这条消息位于 SAS 日志中:“注意:数据步因循环而停止。”。通过谷歌搜索该消息,我找到了描述该错误的 SAS 论文。它建议在 SET 语句之前不要使用 IF 语句,而是使用 OBS= 数据集选项来限制读取的观测值数量。

因此,您可以将行:更改

if _N_ = 1 then set BEFORE;

为:

set BEFORE(obs=1);

当我通过此更改运行代码时,“Before IF:”行仍然打印两次,我不确定为什么会这样。但循环NOTE并没有发生,所以我相信这就是解决方案。

I ran your sample code, and you omitted a crucial piece of information: This message was in the SAS log: "NOTE: DATA STEP stopped due to looping.". Googling on that message led me to a SAS paper describing the error. It suggested not using an IF statement before the SET statement, but to use the OBS= data set option to restrict the number of observations read.

So you would change the line:

if _N_ = 1 then set BEFORE;

to:

set BEFORE(obs=1);

When I ran your code with this change, the "Before IF:" line still printed twice, and I'm not sure why that is so. But the looping NOTE did not occur, so I believe that is the solution.

七七 2024-10-21 13:22:10

SET 是一个可执行语句,也就是说,除非被执行,否则在执行数据步骤时,它不会重置变量或加载下一个观察的数据。 (不过,它在编译数据步骤时设置或更改 PDV。)由于 if 条件,它仅执行一次。

底部的隐式 OUTPUT 语句每次迭代都会输出一个观察结果。 SAS 监视数据步骤是否无限循环,在第二次迭代后停止数据步骤并生成注释。

The SET is an executable statement, that is, unless being executed, it does not reset variables or load the next observation's data, when the data step is executed. (It sets up or alter PDV when the data step is compiled, though.) Because of the if condition, it is executed only once.

The implicit OUTPUT statement at the bottom outputs an observation per iteration. SAS, monitoring to see if a data step loops infinitely, stops the data step after the second iteration and generates the note.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文