SAS:设置语句点 = _N_

SAS: set statement point = _N_

我正在尝试理解一个朋友的代码,看看能不能为我的论文找到一些灵感。他运行了一个部分,在该部分中他创建了一个数据集并输入了 3 个数据集。然而,我不明白的是,他使用了3个set语句,而后面的数据集使用point = "_ N _"

下面的代码有什么用?

        data Other;
            set One;
            set Two point = _N_;
            set Three point = _N_;
            array Rating[*] Unrated;
            array Amortising[*] '1'n;
            array Rating_old[*] old_Unrated;
            AM = 0;
            do i = 1 to dim(Rating);
                Rating[i] = Rating[i] + Rating_old[i] * Amortising[i];
            end;
        run;

输入数据集如下所示

data one;
input Segment count weight ;
datalines;
1 0 0.1
99 1 0.2
;
run;

data two;
input block $ type '0'n '1'n '99'n;
datalines;
50 A 100% 10% 0%
50 S 100% 10% 0%
51 S 100% 10% 0%
52 S 100% 10% 0%
132 S 100% 12% 0%
;
run;

data three;
input DPD $ block type $ segment count weight;
datalines;
AM 50 S 1 0 0.1
Unrated 51 S 99 0.2
NPE 132 S 1 0.5
;
run;

只是想看看这个点 = _ N _ 有什么用!

在这个程序中它什么都不做。如果最后两个 set 语句中没有 point= 选项,程序将 运行 完全相同。

POINT= 让您可以直接访问观察结果。 _N_ 自动变量在数据步长的每次迭代中递增一次。因此,在第一次迭代中,该步骤将从三个输入中的每一个中读取第一个观察值。如果没有 point= 选项,这正是会发生的情况。

请注意,当第一个 SET 语句读取文件末尾时,该程序将停止。如果没有 POINT= 那么当三个 set 语句中的任何一个试图读取输入文件末尾时它都会停止。您可以通过使用和测试 NOBS= 选项来执行相同操作并避免 SAS 日志中的错误。

set One;
if _n_ <= nobs2 then set Two nobs=nobs2;
if _n_ <= nobs3 then set Three nobs=nobs3;

鉴于显示的数据集,它不执行任何操作。

但是,如果 ONE 数据集的行数多于其他两个数据集中的一个或两个数据集,当它 运行 超出最短数据集的行数时,它将避免数据步骤停止。例如,运行 这个:

  data Other;
        set Two;
        set One point = _N_;
        set Three point = _N_;
        array Rating[*] Unrated;
        array Amortising[*] '1'n;
        array Rating_old[*] old_Unrated;
        AM = 0;
        do i = 1 to dim(Rating);
            Rating[i] = Rating[i] + Rating_old[i] * Amortising[i];
        end;
    run;

只是交换两个和一个。现在你得到 5 行,而如果你去掉 point=_n_,你仍然只会得到两行。因此,编写该程序可能是为了确保 ONE 的所有行都得到表示(类似于 SQL 中的左联接,只是您不在此处联接任何内容)。如果只是一对一的合并,即使没有 by 语句,写成 merge 也可能更清楚。不过,通常有一个有效的合并键可以合并。