1

我正在尝试遍历具有 50000 行的列。我想将say i中的值与(i + 1)进行比较。我知道如何做到这一点的唯一方法是定义一个数组。但是,只有一个变量,即变量列名称,例如 Col,但该列中有 50000 个观察值。当我使用:

  array Transform {50000} Col

其中 Transform 是数组的名称,Col 是我的数据集中的列名,我收到一个下标错误,因为变量太少,即只有 1 vs 50000。我尝试用 {50000,1} 替换 {50000}(和甚至 {*}),因此编译器识别出有 50k 个观察值且只有一列。此外,我试图转置数据集,但这似乎很困难,因为我需要稍后将另一个变量添加到数据集上,这取决于 i 和 (i+1) 的值。

有没有一种方法可以使用任何方法(不一定是数组)遍历列以比较 i 和 (i+1) ?谢谢您的帮助 :)

4

3 回答 3

4

使用 LAG 的示例:

data input;
    infile cards;
    input transform;
cards;
3
5
8
12
16
;
run;

data comp;
    set input;
    transform_change = transform - lag1(transform);
run;

对于倒序的行:

data input_rownum / view=input_rownum;
set input;
rownum = _N_;
run;

proc sort data=input_rownum out=input_reversed;
by descending rownum;
run;

data comp_reverse;
    set input_reversed;
    transform_change = transform - lag1(transform);
run;

LAG1 表示变量的先前值。LAG2 用于 pre-previous,依此类推。有关更多信息,请参阅文档。

于 2013-09-20T09:16:17.133 回答
3

数组跨变量工作,因此不适合您的任务。有几个选项供您选择,考虑到行数较少,最简单的方法可能是仅加入数据集本身,行号偏移一。然后,您可以进行比较。

data want;
merge have have (firstobs=2 rename=(col=col_plus1));
run;
于 2013-09-20T08:39:29.763 回答
1

如果您只想将第 i 行与 i+1 进行比较,则可以使用该lag函数。这会从读取的前一行中提取值(使用循环时要小心,因为并非所有行都将在循环中处理)

于 2013-09-20T08:25:02.163 回答