现有文件CENSUS,含有二个家庭及其家庭成员的记录。H表示家庭,P表示个人:
H321S.MAINST
PMARYE21 F
PWILLIAMM23 M
PSUSANK3 F
H324S.MAINST
PTHOMASH79 M
PWALTERS46 M
PALICEA42 F
PJOY20 F
PJOHNS16 M
PPAULR12 M
若要将每个人的记录中含有家庭地址并输出到一个SAS数据集中,程序如下:
DATAPEOPLE(DROP=TYPE);
RETAINADDRESS;
INFILECENSUS;
INPUT@1TYPE$@;
IFTYPE=‘H’THENDO;
INPUT@3ADDRESS$20.
RETURN;
END;
ELSEIFTYPE=‘P’ THEN DO;
INPUT@3NAME$10.AGE2.+1SEX$1.;
OUTPUT;
END;
PROC RPINT;RUN;
@符号用于读记录并检查记录的类型。RETAIN将ADDRESS的值读进每个人的记录中。RETURE的作用是当TYPE为H时,从记录中读完ADDRESS后,返回另一个记录的第一步。
运行结果省略。
如果调查表文件中含有家庭成员数,那么可用DO循环创建SAS数据集。例如,文件DATAIN中有二条记录,每个记录中既有家庭情况又有个人情况。还有一个字段表示家庭成员数:
321S.MAINST3MARYE21FWILLIAMM23 MSUSANK 3 F
324S.MAINST6THOMASH79MWALTERS46MALICE A
42FJOY20FJOHNS16MPAULR12 M
对于这样的资料,有两种方法创建的SAS数据集。当知道所有记录中最多的家庭成员数时,用下列方法:SAS中每条记录对应一个家庭,一个人对应于一个变量。当家庭成员数少于最多的家庭成员时,变量为缺省值。程序如下:
DATAHOUSES;
INFILEDATAIN;
ARRAYNAME{6}$10NAME1-NAME6;
ARRAYAGE{6}AGE1-AGE6;
ARRAYSEX{6}$SEX1-SEX6;
INPUTADDRESS$15.NUM2.+1@;
END;
PROCPRINT;RUN;
第一个INPUT语句读ADDRESS和NUM值。@符号的作用是保持指针直到下个INPUT语句。三个ARRAY语句用于相应的变量NAME,AGE和SEX。
运行结果省略。
第二种方法是使每个人单独成为一条记录,并包含家庭情况。程序如下:
DATAPERSON;
INFILEDATAIN;
RETAINADDRESS;
INPUTADDRESS$15.NUM2.+1@;
DOⅠ=1TONUM;
INPUTNAME$10.AGE2.+1SEX$1.+1@;OUTPUT;
END;
PROCPRINT;RUN;
这个数据集合有较多的记录和较少的变量。没有缺省值。OUTPUT的使用,使每个人变成数据集中的一条记录。
运行结果省略。
