我正在尝试理解朋友的代码,以查看是否可以从我的论文中找到灵感。他在一个区域中创建了一个数据集并输入了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 _将用于什么!
答案 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
。不过,通常情况下,有一个有效的合并键可以进行合并。