0

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

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;

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

4

2 回答 2

2

您只需要添加一条retain语句,这样 SAS 就不会obs在每次新观察时重置为 0。

data latency;
retain obs 0;
obs = obs + 1;
...
run;
于 2012-10-25T17:30:54.660 回答
1

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

obs = 1;                 * ADDED LINE;

有了这个:

retain obs 0;            * ADDED LINE;

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

于 2012-10-25T17:35:50.290 回答