範例 (REPEATING DATA 指令)
基本範例
* Build a file with each case representing one vehicle and
spread information about the household to each case.
INPUT PROGRAM.
DATA LIST / SEQNUM 2-4 NUMPERS 6-7 NUMVEH 9-10.
REPEATING DATA STARTS=12 /OCCURS=NUMVEH
/DATA=MAKE 1-8 (A) MODEL 9 (A) NUMCYL 10.
END INPUT PROGRAM.
BEGIN DATA
1001 02 02 FORD T8PONTIAC C6
1002 04 01 CHEVY C4
1003 02 03 CADILAC C8FORD T6VW C4
END DATA.
LIST.
- 從代表家庭記錄的檔案中擷取資料。 每一個輸入觀察值都記錄在單一記錄上; 沒有連續記錄。
- 房屋內的總人數和住戶擁有的車輛數目均記錄在每一項紀錄內。 每筆記錄的第一個數字欄位 (直欄 1-4) 是每筆記錄唯一的識別號碼。 接下來的兩個數字是家庭人數和車輛數目。 記錄的其餘部分包含每一個車輛的重複資訊群組: 車輛的製造、型號及汽缸數。
INPUT PROGRAM表示輸入程式的開頭,END INPUT PROGRAM表示輸入程式的結尾。DATA LIST會從記錄的家庭部分讀取變數。 所有固定格式變數都定義在DATA LIST上。REPEATING DATA會從重複群組中讀取資訊,並建置輸出觀察值。 重複群組從直欄 12 開始。 每個輸入觀察值的重複群組數目由變數 NUMVEH的值提供。 每個重複群組各定義三個變數: MAKE、 MODEL和 NUMCYL。- 第一筆輸入記錄包含兩個重複群組,在作用中資料集內產生兩個輸出觀察值。 從包含一個車輛上的資訊的第二輸入記錄建立一個輸出箱,從第三記錄建立三個輸出箱。 在
DATA LIST上定義的固定格式變數值會傳播至作用中資料集中所建置的每個新觀察值。 6 個觀察值結果,如下所示。
SEQNUM NUMPERS NUMVEH MAKE MODEL NUMCYL
1 2 2 FORD T 8
1 2 2 PONTIAC C 6
2 4 1 CHEVY C 4
3 2 3 CADILAC C 8
3 2 3 FORD T 6
3 2 3 VW C 4
NUMBER OF CASES READ = 6 NUMBER OF CASES LISTED = 6
搭配使用 REPEATING DATA 與混合檔案類型
* Use REPEATING DATA with FILE TYPE MIXED: read only type 3 records.
FILE TYPE MIXED RECORD=#SEQNUM 2-4.
RECORD TYPE 003.
REPEATING DATA STARTS=12 /OCCURS=3
/DATA=MAKE 1-8(A) MODEL 9(A) NUMCYL 10.
END FILE.
END FILE TYPE.
BEGIN DATA
1001 02 02 FORD T8PONTIAC C6
1002 04 01 CHEVY C4
1003 02 03 CADILAC C8FORD T6VW C4
END DATA.
LIST.
- 此範例中的作業是僅讀取變數 #SEQNUM值為 003 之記錄的重複資料。
REPEATING DATA在指定混合檔案類型的FILE TYPE結構內使用。 記錄識別變數 #SEQNUM 位於直欄 2-4 中。RECORD TYPE指定僅將 #SEQNUM 值為 003 的記錄複製到作用中資料集。 所有其他記錄都會跳過。REPEATING DATA表示重複群組從直欄 12 開始。OCCURS次指令表示每個輸入觀察值都有三個重複群組,且DATA次指令指定重複群組中變數的名稱、位置及格式。- 在此範例中不需要
DATA LIST指令,因為輸入觀察值上的任何資訊都不會傳播至輸出觀察值。 不過,如果 #SEQNUM 有多個值為 003 的輸入觀察值,而且它們沒有全部具有三個重複群組,則需要DATA LIST定義變數,其每一個輸入觀察值的值會指出該觀察值的重複群組數目。 然後會在OCCURS次指令上指定此變數。
搭配使用轉換與 REPEATING DATA
INPUT PROGRAM.
DATA LIST / PARENTID 1 DATE 3-6 NCHILD 8.
REPEATING DATA STARTS=9 /OCCURS=NCHILD
/DATA=BIRTHDAY 2-5 VACDATE 7-10.
END INPUT PROGRAM.
COMPUTE AGE=DATE - BIRTHDAY.
COMPUTE VACAGE=VACDATE - BIRTHDAY.
DO IF PARENTID NE LAG(PARENTID,1) OR $CASENUM EQ 1.
COMPUTE CHILD=1.
ELSE.
COMPUTE CHILD=LAG(CHILD,1)+1.
END IF.
FORMAT AGE VACAGE CHILD (F2).
BEGIN DATA
1 1987 2 1981 1983 1982 1984
2 1988 1 1979 1984
3 1988 3 1978 1981 1981 1986 1983 1986
4 1988 1 1984 1987
END DATA.
LIST.
- 資料來自包含學區內家長相關資訊的檔案。 每一個輸入觀察值都記錄在單一記錄上; 沒有連續記錄。
- 每一筆記錄會依數字來識別母項,並指出它們有多少子項。 重複小組為每名兒童提供出生年份和疫苗接種年份。
REPEATING DATA指出重複群組在直欄 9 中開始。 NCHARD 的值指出每一筆記錄有多少重複群組。- 前兩個
COMPUTE指令會計算每一個子項的年齡,以及接種疫苗的年齡。 這些轉換指令指定在輸入程式之外。 - 因為重複群組沒有描述性值,所以
DO IF結構會計算變數 子項 ,以區分第一胎、第二胎等。 CHild 的值將會是 1 (代表第一次出生)、2 (代表第二次出生) ,依此類推。LIST輸出如下所示。
PARENTID DATE NCHILD BIRTHDAY VACDATE AGE VACAGE CHILD
1 1987 2 1981 1983 6 2 1
1 1987 2 1982 1984 5 2 2
2 1988 1 1979 1984 9 5 1
3 1988 3 1978 1981 10 3 1
3 1988 3 1981 1986 7 5 2
3 1988 3 1983 1986 5 3 3
4 1988 1 1984 1987 4 3 1
NUMBER OF CASES READ = 7 NUMBER OF CASES LISTED = 7