我正在玩 SAS(版本:7.11 HF2),我有一個包含 A 列和 B 列的資料集,變數 A 是十進制的。當我運行下面的代碼時,奇怪的是我得到了一個 . (點)在輸出的第一行。
輸入資料:
a, b
2.4, 1
1.2, 2
3.6, 3
代碼:
data test;
c = a;
set abcd.test_data;
run;
輸出資料:
c, a, b
., 2.4, 1
2.4, 1.2, 2
1.2, 3.6, 3
3.6, ,
奇怪的事情:
- 派生變數總是在右側生成,這個在左側生成。
- . (點)即將到來,并且值在派生列中移動了一行。
有什么幫助嗎?
uj5u.com熱心網友回復:
您的set
陳述句在您的變數賦值陳述句之后。SAS 首先嘗試分配尚未讀取的a
to的值。c
首先放置您的set
陳述句,然后進行變數操作。
data test;
set abcd.test_data;
c = a;
run;
uj5u.com熱心網友回復:
這里沒有什么奇怪的,只是把SET
之前的宣告。
資料步處理包括 2 個階段。
- 編譯階段
- 執行階段
在編譯階段,會掃描資料步驟中的每個陳述句以查找語法錯誤。
在執行階段,創建資料集的資料部分。
它將變數初始化為缺失,最后按照它們在資料步驟中的位置確定的順序執行其他陳述句。
在您的情況下, set 陳述句在c
. 那時a
和b
被設定為缺失,因此給出 的缺失值c
。最后,該SET
陳述句將被執行,這就是為什么您最終會在第一行得到一個a
值b
。
data test;
set abcd.test_data;
c = a;
run;
請注意,資料集中的第一個變數是c
,因為這是代碼中的第一個變數。
uj5u.com熱心網友回復:
看起來它確實希望你要求它這樣做。
在資料步驟的第一次迭代中,它將 C 設定為 A 的值。A 的值丟失了,因為您還沒有給它任何值。然后 SET 陳述句將從您的輸入資料集中讀取第一個觀察值。由于沒有明確的 OUTPUT 陳述句,因此在迭代結束時寫入觀察結果。
在資料步驟的其余迭代中,A 在分配給 C 時將具有的值將是最后從輸入資料集中讀取的值。作為輸入資料集一部分的任何變數都是“保留的”,這實際上只是意味著在新的迭代開始時它沒有設定為缺失。
如果目標是使用 A 的先前值創建 C,則可以使用 LAG() 函式創建相同的輸出。
data test;
set abcd.test_data;
c=lag(a);
run;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451599.html
上一篇:LAG函式超過日期