1

我正在尝试理解一个朋友的代码,看看能否为我的论文找到一些灵感。他运行一个部分,在其中创建一个数据集并输入 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;

只是看看 point = _ N _ 将用于什么!

4

2 回答 2

1

在这个程序中它什么也不做。如果没有最后两个 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;
于 2018-08-20T18:48:31.500 回答
1

鉴于显示的数据集,它没有做任何事情。

但是,如果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 中的左连接,除非您在这里没有加入任何内容)。如果它只是一对一的合并merge,即使没有声明,这可能会更清楚地写为 a 。by但是,通常有一个有效的合并键可以合并。

于 2018-08-20T18:54:03.117 回答