SAS:比较列中的值

时间:2013-09-20 07:18:22

标签: arrays sas

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

  array Transform {50000} Col

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

是否有方法循环使用任何方法(不一定是数组)来比较i和(i + 1)?谢谢你的帮助:)

3 个答案:

答案 0 :(得分: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用于前一个,依此类推。有关更多信息,请参阅文档。

答案 1 :(得分:3)

数组跨变量工作,因此不适合您的任务。有几个选项可供选择,因为最简单的行可能只是将数据集连接到自身,行号偏移一。然后,您可以进行比较。

data want;
merge have have (firstobs=2 rename=(col=col_plus1));
run;

答案 2 :(得分:1)

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