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
也可能更清楚。不过,通常有一个有效的合并键可以合并。
我正在尝试理解一个朋友的代码,看看能不能为我的论文找到一些灵感。他运行了一个部分,在该部分中他创建了一个数据集并输入了 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
也可能更清楚。不过,通常有一个有效的合并键可以合并。