之前学习了@
作为列指针在输入时发挥定位作用,@
符号如果放在input
语句的变量名后面也会发挥不同的作用。
其中,双尾@@
和单位@
修饰符是比较常用的两种情况。
双尾@@
实现从每行原始数据读取多个观测
在input
语句结尾处使用双尾@符号(@@)
,就像停车标志一样,表示,“停下,留在原始数据的当前行”。
SAS将停留在那行数据,继续读取数据直到数据读完或者没有双尾@@
符号的input
语句。
来看书中的一个例子:
data rain;
input city $ state $ normalrain meandayrain @@;
cards;
Nome city 2.5 15 Miami FL 6.75
18 Raleigh NC . 12
;
run;
proc print data =rain noobs ;
title "Rain";
run;
打印结果如下:
city | state | normalrain | meandayrain |
---|---|---|---|
Nome | city | 2.50 | 15 |
Miami | FL | 6.75 | 18 |
Raleigh | NC | . | 12 |
单位@
读取原始数据的一部分
当无需读取全部的数据,而是只读取部分数据时。
- 通过只读取需要的变量以确定是否保留当前的观测,然后用一个
@
符号结束input
语句。
- 该符号告知SAS保留那行原始数据,然后可以使用
IF
语句来测试该观测,以确定是否是要保存的观测。
- 如果是,可以使用第二条
input
语句为其余变量读取数据。
通过例子进行理解:
data freeways;
input type $ @;
if type = 'surface' then delete;
input name $ PM $ AM $;
cards;
surface 606 1435 1677
freeway 705 1435 1677
surface 701 1435 1677
freeway 602 1435 1677
freeway 503 1435 1677
freeway 708 1435 1677
;
run;
proc print data = freeways noobs; title "Freeways" ; run;
上面的程序中,先input
变量type
,然后if
语句进行判断type
。
如果是surface
那么删除,只保留高速公路freeway
的数据。
打印结果如下:
type | name | PM | AM |
---|---|---|---|
freeway | 705 | 1435 | 1677 |
freeway | 602 | 1435 | 1677 |
freeway | 503 | 1435 | 1677 |
freeway | 708 | 1435 | 1677 |