示例 (重复 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
将重复数据与混合文件类型配合使用
* 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子命令中指定此变量。
将变换与重复数据配合使用
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 中开始。 NCHILD 的值指示每个记录有多少重复组。- 前两个
COMPUTE命令计算每个儿童的年龄和接种疫苗的年龄。 这些变换命令在输入程序外部指定。 - 由于重复组没有描述性值,因此
DO IF结构会计算变量 CHILD 以区分第一出生的子代,第二出生的子代等。 对于第一次出生, 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