行指针
如果一个观测分布在了数据的多行,这个时候在读取数据时,可能就需要行指针
发挥作用了。
斜线(/)和井号(#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: 8
使用不同input
语句进行读取:
- 使用@'character'列指针但未指定字符长度
data temp1;
input @'Breed:' DogBreed $;
cards;
My dog Sam Breed: Rottweiler Vet Bills: 8
;
run;
proc print data = temp1; title "Temp1"; run;
- 使用@'character'列指针,指定字符长度
data temp2;
input @'Breed:' DogBreed .;
cards;
My dog Sam Breed: Rottweiler Vet Bills: 8
;
run;
proc print data = temp2; title "Temp2"; run;
- 使用@'character'列指针和冒号
:
,指定字符长度
data Temp3;
input @'Breed:' DogBreed :.;
cards;
My dog Sam Breed: Rottweiler Vet Bills: 8
;
run;
proc print data = Temp3; title "Temp3"; run;
例子虽然简单,但是也比较好的体现出了@
和冒号:
修饰符的用法。