程序一(原程序,删去了if语句以使得逻辑更为简单):
- data aaa1;
- length variable $20.;
- if _n_=1 then variable="Week 2";
- output;
- set aaa;
- variable="\li200 "||grpcat;
- run;
程序二:
- data aaa1;
- length variable $20.;
- if _n_=1 then variable="Week 2";
- output;
- set aaa;
- variable="\li200 "||grpcat;
- output;
- run;
结果为:
略加分析,即可知程序一(原程序)中的 output 语句错误的使用逻辑与 set 语句自带的读入新的一行时初始化变量值的特性起了作用,导致 variable 除第一行外全为空值。
建议将原程序修改如下:
- data aaa1;
- length variable $20.;
- if _n_=1 then do;
- variable="Week 2";
- output;
- end;
- set aaa;
- variable="\li200 "||grpcat;
- output;
- run;
第二个 output 语句将 aaa 数据集逐行读入,处理,然后输出。
最后,稍加改造,可以实现在一个数据集的任意行前插入一行的通用写法。示例如下:
- data aaa1;
- set aaa;
- if _n_=1 then do;
- call missing(of _all_);
- variable="Week 2";
- output;
- set aaa point=_n_;
- output;
- end;
- else output;
- run;
此法的关键,在于理解和掌握数据指针 point= 选项和 output 语句的用法。掌握后,也可推广到在任意指定行前插入任意行,甚至插入一个或多个数据集的情形。