我有一个文件,其中第一行是包含一些元数据信息的标题行。
如何获得 SAS 处理器正在处理的当前观察数(比如第一次观察 =1),以便我可以放入一个 IF 子句来处理这种特殊的数据行。
跟进:我想处理第一行并将其中一个列值保留在局部变量中以供进一步处理。我不想在我的最终输出中保留这条线。这可能吗?
我有一个文件,其中第一行是包含一些元数据信息的标题行。
如何获得 SAS 处理器正在处理的当前观察数(比如第一次观察 =1),以便我可以放入一个 IF 子句来处理这种特殊的数据行。
跟进:我想处理第一行并将其中一个列值保留在局部变量中以供进一步处理。我不想在我的最终输出中保留这条线。这可能吗?
自动变量_N_
返回 SAS 数据步循环的当前迭代次数。对于传统的数据步骤,即:
data something;
set something;
(code);
run;
_N_
相当于行号(因为数据步循环的每次迭代都会检索一行)。
因此,如果您只想在第一次迭代中做某事,这将实现:
data something;
set something;
if _n_ = 1 then do;
(code);
end;
(more code);
run;
对于您的跟进,您需要这样的东西:
data want;
set have;
retain _temp;
if _n_ = 1 then do;
_temp = x;
end;
... more code ...
drop _temp;
run;
DROP 和 RETAIN 语句可以出现在代码中的任何位置并且具有相同的效果,我将它们放置在它们的人类逻辑位置。RETAIN 表示每次通过数据步骤循环都不会将变量重置为丢失,因此您可以进一步访问它。
如果您正在阅读一个特别大的文本文件,您可能希望避免if _n_=1 then
每次迭代都必须执行 ( ) 条件。您可以通过两次读取文件来执行此操作 - 一次提取标题行,再次读取文件,如下所示:
data _null_; /* create dummy file for demo purposes */
file "c:\myfile.txt";
put 'blah'; output;
put 'blah blah blah 666'; output;
data _null_; /* read in header info */
infile "c:\myfile.txt";
input myvar:$10.; /* or wherever the info is that you need */
call symput('myvar',myvar);/* create macro variable with relevant info */
stop; /* no further processing at this point */
data test; /* read in data FROM SECOND LINE */
infile "c:\myfile.txt" firstobs=2 ; /* note the FIRSTOBS option */
input my $ regular $ input $ statement ;
remember="&myvar";
run;
不过,对于简短/简单的东西,乔的答案更好,因为它更具可读性..(并且对于小文件可能更有效)。