行指针
如果一个观测分布在了数据的多行,这个时候在读取数据时,可能就需要行指针发挥作用了。
斜线(/)和井号(#n)
斜线(/)和井号(#n)是常用的两种行指针。
如果要为一个观测读取位于多行中的数据,在input语句中插入一个斜线指示跳到下一个原始数据行。
#n执行跳转到特定的行,n指定行号。例如,#2指定跳转到原始数据行的第2行。
用书中的一个例子进行说明:
data temp;
input city $ state $
/ normalhigh normallow
#3 recordhigh recordlow;
cards;
Nome AK
55 44
88 29
Miami FL
90 75
97 65
Raleigh Nc
88 68
105 50
;
run;
proc print data = temp ;
title "High and Low Temperatures";
run;
列指针
@符号
在SAS的data步中,@符号在不同的位置发挥不同的作用。
@n
@在变量名前面,后面紧跟数字,表明将指针移动到特定的位置进行数据的读取。
例如@40,表示指针移动到列40进行读取数据。
@'character'列指针
如果不知道所要读取的变量开始的位置,但是知道它总是在一个特定的字符或者单词后面出现,就可以使用@'character'列指针。
如书中的例子,要读取一个狗品种相关的数据,但是原始数据并不整齐,但是已经知道狗的品种信息总是出现在breed之后,那么可以在input语句中使用下列方式读取:
input @'Breed:' Dogbreed $;
冒号修饰符
上面的语句没有指定字符串长度,默认是8,因此,当狗的品种字符超过8了,在读取时便可能出现问题。
但是如果指定一个过长的长度值,也可能读入后面的无用或者多余信息。
这个时候,在变量名之后使用冒号:修饰符是不错的选择,它告诉SAS,读到指定的长度,或者首次遇到空格。
来看书中的一个例子,对于原始数据:
My dog Sam Breed: Rottweiler Vet Bills: $478
使用不同input语句进行读取:
- 使用@'character'列指针但未指定字符长度
data temp1;
input @'Breed:' DogBreed $;
cards;
My dog Sam Breed: Rottweiler Vet Bills: $478
;
run;
proc print data = temp1; title "Temp1"; run;
- 使用@'character'列指针,指定字符长度
data temp2;
input @'Breed:' DogBreed $20.;
cards;
My dog Sam Breed: Rottweiler Vet Bills: $478
;
run;
proc print data = temp2; title "Temp2"; run;
- 使用@'character'列指针和冒号
:,指定字符长度
data Temp3;
input @'Breed:' DogBreed :$20.;
cards;
My dog Sam Breed: Rottweiler Vet Bills: $478
;
run;
proc print data = Temp3; title "Temp3"; run;
例子虽然简单,但是也比较好的体现出了@和冒号:修饰符的用法。