SAS 嵌套 do 循环与数组
SAS nested do loops with arrays
在理解以下代码时遇到问题。此代码段应该输出一个数据集,该数据集将目标值 (sasuser.ctargets
) 与实际值 (sasuser.monthsum
) 进行比较。观测按月和年匹配并填充到 targets
数组。该代码完全可以正常工作,但在我看来它不应该。
查看嵌套的 DO 循环:
Targets
在嵌套的 DO 循环中由 year
和 j
索引。我知道外循环使用了三个迭代(i=1 to 3
):一个用于年份变量(1997-1999)的每个值。然而,Year
是在 DO 循环之外声明的。因此,如果自动变量 _n_
在 DO 循环的第一次迭代中创建目标数组,那么 targets
数组到底是如何正确填充 1998 年和 1999 年的,直到后续迭代才读取这些数据数据步骤? year
作为迭代器是如何工作的?
data work.lookup1;
array targets(1997:1999,12) _temporary_;
if _n_=1 then do i=1 to 3;
set sasuser.ctargets;
array mnth(*) Jan--Dec;
do j=1 to dim(mnth);
targets(year,j)=mnth(j);
end;
end;
set sasuser.monthsum(keep=salemon revcargo monthno);
year=input(substr(salemon,4),4.);
ctarget=targets(year,monthno);
format ctarget dollar15.2;
run;
唯一可行的方法是变量 YEAR
在数据集 SASUSER.CTARGETS
.
中
在理解以下代码时遇到问题。此代码段应该输出一个数据集,该数据集将目标值 (sasuser.ctargets
) 与实际值 (sasuser.monthsum
) 进行比较。观测按月和年匹配并填充到 targets
数组。该代码完全可以正常工作,但在我看来它不应该。
查看嵌套的 DO 循环:
Targets
在嵌套的 DO 循环中由 year
和 j
索引。我知道外循环使用了三个迭代(i=1 to 3
):一个用于年份变量(1997-1999)的每个值。然而,Year
是在 DO 循环之外声明的。因此,如果自动变量 _n_
在 DO 循环的第一次迭代中创建目标数组,那么 targets
数组到底是如何正确填充 1998 年和 1999 年的,直到后续迭代才读取这些数据数据步骤? year
作为迭代器是如何工作的?
data work.lookup1;
array targets(1997:1999,12) _temporary_;
if _n_=1 then do i=1 to 3;
set sasuser.ctargets;
array mnth(*) Jan--Dec;
do j=1 to dim(mnth);
targets(year,j)=mnth(j);
end;
end;
set sasuser.monthsum(keep=salemon revcargo monthno);
year=input(substr(salemon,4),4.);
ctarget=targets(year,monthno);
format ctarget dollar15.2;
run;
唯一可行的方法是变量 YEAR
在数据集 SASUSER.CTARGETS
.