SAS:设置语句点= _N_

时间:2018-08-20 16:18:27

标签: arrays sas sas-studio

我正在尝试理解朋友的代码,以查看是否可以从我的论文中找到灵感。他在一个区域中创建了一个数据集并输入了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 _将用于什么!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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语句,也可能更清楚地将其写为by。不过,通常情况下,有一个有效的合并键可以进行合并。