簡體   English   中英

SAS:比較列中的值

[英]SAS: Compare values in a column

我正在嘗試遍歷具有50000行的列。 我想比較說i與(i + 1)的值。 我知道如何執行此操作的唯一方法是定義一個數組。 但是,只有一個變量,即變量列名稱,例如Col,但列內有50000個觀測值。 當我使用時:

  array Transform {50000} Col

其中Transform是數組的名稱,Col是我的數據集中的列名稱,我收到一個下標錯誤,因為變量太少,即Only 1 vs50000。我嘗試用{50000,1}替換{50000}(和即使是{*}),因此編譯器也可以識別出5萬個觀測值和只有一列。 此外,我嘗試轉置數據集,但這似乎很困難,因為稍后需要在數據集上添加另一個變量,該變量取決於i和(i + 1)的值。

有沒有一種方法可以使用任何方法(不一定是數組)遍歷該列以比較i和(i + 1)? 謝謝您的幫助 :)

使用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用於上一個,等等。 有關更多信息,請查閱文檔。

數組跨變量工作,因此不適用於此處的任務。 考慮到行數少,最簡單的方法可能就是將數據集自身連接起來,行號偏移一個,這有兩種選擇。 然后,您可以進行比較。

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

如果只想將第i行與i + 1比較,則可以使用lag函數。 這會從上一行讀取的值中提取值(請注意,將其與循環一起使用時,因為並非所有行都會在循環中處理)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM