data语句、input语句和datalines语句配合数据体产生SAS数据集的方法有3种,即列举法、按列输入法和格式化法。
当变量个数和观测次数不多时,SAS数据集也不大,可以用datalines语句配合数据体产生SAS数据集。例如例2.2中数据集salary就是这样产生的。这时需要在Editor窗口中输入data语句、input语句、datalines语句等,并将数据体键入或拷贝至Editor窗口。
data语句以关键词data开头,后跟数据集名(成员名)。其功能是开始数据步,指示SAS产生数据集并且指定产生的数据集名。如语句“data wang2;”指示SAS生成名为wang2的临时数据集work.wang2,其中逻辑库名是work,成员名是wang2。
input语句以关键词input开头,后跟变量名,用于指示SAS导入数据时数据体对应的变量。数值型变量不区分整型和实型,字符串型变量名后要加“$”,以向SAS说明该变量是字符串型变量。例如语句“input no name$x1-x4z;”表示数据行中变量值的顺序应当是:数值型变量no、字符串型变量name、数值型变量x1、数值型变量x2、数值型变量x3、数值型变量x4、数值型变量z。所有变量名只能用英文字符表示,SAS软件中字符串型变量值可为中文字符。
datalines语句只由关键词datalines和分号组成,用于表示该语句以下为数据体(多次观测值)。
数据体每行写一次观测值(称为数据行)。由于数据体情形不同,具体输入时有3种方法。
1.列举输入法(list input)
当变量的值都不超过8个英文字符(1个中文字符相当于2个英文字符)长而且字符间没有空格时,可以用列举输入法:数据行的观测值与input语句中的变量名对应,不同变量的值间用至少1个空格分开(不加任何符号),如例2.2所示。有时每次观测只写一行不方便,可以在input语句末尾加停止符号“@@”,其指示SAS读完全部变量的一次观测值后就停一下,接着再从这个位置开始读第1个变量的下一观测值,依此类推,所以SAS见到“@@”就会连读数据,直到数据体结束。程序最后一行是空语句,它只由分号组成,表示数据体结束。
例如,对于如下程序:
提交此程序后,数据集w有2个变量x和y,每个变量有3次观测,它们的第1次观测值是1,2;第2次观测值是3,4;第3次观测值是5,6.1。
注意:单独一个符号“@”也是停止符号,单独一个“@”能使SAS每读一次数据停留一下。所以对于一些压缩数据输入时很方便。
例如,连续记录5天澳元、瑞士法郎、欧元和英镑的外汇牌价,涉及3个变量:type(币种)、rate(汇率)和day(第几天)。表3-1中的外汇牌价数据是完全不压缩数据。表3-2中的外汇牌价数据是初步压缩数据。表3-3中的外汇牌价数据是完全压缩数据。
表3-1 未被压缩过的5天外汇牌价表
续表3-1
表3-2 初步压缩过的5天外汇牌价表
表3-3 高度压缩后的5天外汇牌价表
显然表3-3最简洁。
例3.1 连续5日的澳元、瑞士法郎、欧元和英镑的汇率如表3-1、表3-2和表3-3所示,设变量是type(币种)、rate(汇率)和day(第几天),试把它们读成SAS数据集exchang1、exchange2和exchange3。
解 因为表3-1已排成SAS数据集对应形式,可以直接输入。对于表3-1可用如下程序:
提交程序后得到如下结果:
因为表3-2和表3-1差不多,只是把5行并成1行,故可以用停止符号“@@”直接输入。对于表3-2可用如下程序:
因为表3-3未排成SAS数据集对应形式,而是把币种相同的5行并成1行,共同的type只读了一次。这时可以用停止符号“@”控制输入。对表3-3采用如下程序(第一个“@”的作用是先读入type的1个值,然后每读一个type的值停止一下,连读5个rate的值):
提交后,后两个程序输出的所读数据都是:
(www.xing528.com)
如果用将在4.5节介绍的sort程序把它们排序,得到的结果就和第1个程序的结果一致,得到更合用的SAS数据集。程序如下:
当使用列举法时,各变量的值间只要以若干个空格分开即可。英文字符串限长8个字符,中文字符串限长4个字符。
2.按列输入法(culmn input)
有时作为变量值的字符串超长或需要中间留空格,这时可以把这些字符串输入到固定列:预先安排好这些变量的值放在哪些列,在input语句中指明这些值所在列的位置,从而SAS就会从这些固定列读入变量的值。这样的数据称为按列排列数据,读取这种数据的方法称为按列输入法。具体实施方法如例3.2所示。
例3.2 设需要建立企业统计表,其中变量name、addres、staff、capital分别表示企业名称、地址、工人数、注册资金(单位为万元)。两家企业的登记信息如表3-4所示,试建立数据集work.compn,让它包含上述信息。
表3-4 两家企业的登记信息
解 因为变量值中有中文,故只能在Word中编程然后拷贝至Editor窗口。因为英文字符串中有空格,中文字符串超过4个字符,故对于变量name和addres采用按列输入法。数据体第1行中变量name的值“abcde Co.Ltd.”由“abcde”、空格、“Co.”、空格、“Ltd.”组成,包括空格有14个字符,至少占用14列。变量addres的值“123Shanghai efghlu”有17个字符,加上2个空格至少占用19列。第2行中变量name的值“宇宙电脑股份有限公司”有10个中文字符,占用20列。变量addres的值“某某市某某街8号”有8个字符,占用15列。于是可以指定SAS数据集中,第1—20列是变量name的值,第21—40列存放变量addres的值,变量staff和capital的值放在第41列之后的不固定列,彼此用若干个空格隔开。于是建立程序如下(注意,数据体要按上述格式键入):
提交该程序后在Output窗口可见到临时数据集compn中包含所需信息。如果不指定第1—20、第21—40列的安排,则数据集compn中的变量不能包含两家企业的信息。
3.格式化输入法(formatted input)
有些数据,例如调查数据,需要大量固定列,多达数百列,而且中间不留空格。因为原始统计表中不留空格,这时若仍想按列输入,但是多列数据安排起来很麻烦,于是可以采用另一种输入法,称为格式化输入法:关键词input后接变量名,每个数值型变量后接1个数值和“.”,数值说明该变量值所占列数;字符串型变量后则是接“$”再接1个数值和“.”,数值说明该变量值所占列数。如果数据体中该变量后面要空几格,则用“+”后接1个数字说明空格数。变量名之间仍要用空格隔开。
例3.3 统计公司职工的工号(IdNum)、姓(LName)、名(FName)、职务码(JobCode)、工资(Salary)、电话(Phone),形成SAS数据集。所用程序如下:
程序说明:这儿input语句采取格式化输入法:“IdNum$4.+2”表示变量IdNum的值占4列(即第1—4列),空2格;“LName$11.”表示变量LName的值占之后的11列(即第7—17列);“FName$11.”表示变量FName的值占之后的11列(即第18—28列);“JobCode$3.+1”表示变量JobCode的值占之后的3列(即第29—31列),空1格;“Salary 5.+1”表示变量Salary的值占之后的5列(即第33—37列),空1格;“Phone$12.”表示变量Phone的值占之后的12列(即第39—50列)。
注意:打印以按列输入法或格式化输入法生成的SAS数据集时,在Output窗口得到的数据集中,各变量的值间仍安排空格。实际使用时往往只对某些变量的输入采用按列输入法或格式化输入法,其余变量的值间用空格隔开。这种方法也称为混合输入法。
下面举一个调查表的例子。
例3.4 设某次对调查者提出12个问题:问题1—问题4和问题9—问题11是选择题,在a、b、c、d中任选其一;问题5—问题8是是非题,在0和1中任选其一;问题12是多选题,在a、b、c、d、e和f中任选多个。3个人的回答内容如表3-5所示(固定前11列,之后不固定)。如果不读入5—8列,应当怎么办?
表3-5 调查表
解 如果把它拷贝到Editor窗口作为数据体,并用1,2,3,4,9,10,11列作为变量x1—x4以及x9—x11的值,不读5,6,7,8列(跳过),再读取多选题的答案作为变量x12的值。那么可以采用如下程序:
提交后得到的结果是:
由上可见按列输入法和格式化输入法有如下优点:
(1)不要求变量值之间有空格,可以节省空间,特别是当变量有成百个时节省空间很需要。
(2)缺失值可以直接用空格代替,不用另加符号。
(3)字符串中可以包含空格。
(4)可以跳过一些列读取数据(如例3.4)。
当在Word文档或Excel等系统中已形成待定变量数据体(没有变量名)而且数据量不大时,可以使用input语句+datalines语句+数据体的方法,不用通过键盘输入数据体,而是将待定变量数据体拷贝到数据体的位置。当调查数据量很大时可用3.3节的方法建立SAS数据集。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。