如何在数据步骤中参考循环中的当前行/观察数?

时间:2012-10-25 17:10:11

标签: sas

例如,我有关于迭代的各种延迟的数据并应用线性函数,如图所示:(该函数只是一个例子)

data latency;
input lat1 - lat20;
array cost[20];
array lat[20];
do x = 1 to 20;
cost[x] = lat[x] * 1.875;
end;
drop x;
datalines;
0.42 0.85 0.59 0.06 0.21 0.35 0.1 0.08 0.85 0.53 0.81 0.44 0.47 0.2 0.99 0.32 0.18 0.87 0.33 0.84
0.11 0.83 0.02 0.59 0.74 0.65 0.76 0.45 0.57 0.22 0.2 0.13 0.42 0.15 0.05 0.51 0.48 0.95 0.39 0.92
0.8 0.9 0.65 0.29 0.77 0.0 0.24 0.05 0.16 0.72 0.58 0.9 0.35 0.63 0.79 0.41 0.73 0.36 0.82 0.16
0.74 0.21 0.57 0.73 0.83 0.78 0.77 0.92 0.13 0.39 0.52 0.14 0.1 0.77 0.68 0.99 0.26 0.37 0.97 0.83
;
run;

如何在循环的每次迭代中使用当前观察数保存变量,以便我以后可以在计算中使用它?

我知道proc print会自动打印观察编号,但是如何访问它并将其存储到数据步骤中的变量?有没有办法这样做,因为sas逐行读取数据线?

我尝试了这个,但每次观察时obs变量为2。

data latency;
input lat1 - lat20;
obs = 1;                 * ADDED LINE;
array cost[20];
array lat[20];
do x = 1 to 20;
cost[x] = lat[x] * 1.875;
end;
obs = obs + 1;           * ADDED LINE;
drop x;
datalines;
0.42 0.85 0.59 0.06 0.21 0.35 0.1 0.08 0.85 0.53 0.81 0.44 0.47 0.2 0.99 0.32 0.18 0.87 0.33 0.84
0.11 0.83 0.02 0.59 0.74 0.65 0.76 0.45 0.57 0.22 0.2 0.13 0.42 0.15 0.05 0.51 0.48 0.95 0.39 0.92
0.8 0.9 0.65 0.29 0.77 0.0 0.24 0.05 0.16 0.72 0.58 0.9 0.35 0.63 0.79 0.41 0.73 0.36 0.82 0.16
0.74 0.21 0.57 0.73 0.83 0.78 0.77 0.92 0.13 0.39 0.52 0.14 0.1 0.77 0.68 0.99 0.26 0.37 0.97 0.83
;
run;

proc print data=latency;
run;

这是一个小例子,但实际上我不能简单地添加一个新的变量,它将行号存储到每个数据行的开头并读入。这对于实际的数据集是不实际的。

2 个答案:

答案 0 :(得分:2)

您只需添加retain语句,以便SAS在每次新观察时都不会将obs重置为0。

data latency;
retain obs 0;
obs = obs + 1;
...
run;

答案 1 :(得分:1)

你的第一次尝试非常接近。再试一次,但这次更换这一行:

obs = 1;                 * ADDED LINE;

有了这个:

retain obs 0;            * ADDED LINE;

这样,您的obs变量将保留在整个数据集中,而不是每次都重置为1。