我有一个文件,其中第一行是包含一些元数据信息的标题行。获取SAS中的当前观察计数
如何获得SAS处理器正在处理的当前观察编号(比如说第一个观察值为1),以便我可以放入IF子句来处理此类特殊数据行。
后续行动:我想要处理第一行并将列值保留在局部变量中作进一步处理。我不想在最终输出中保留这一行。这可能吗?
我有一个文件,其中第一行是包含一些元数据信息的标题行。获取SAS中的当前观察计数
如何获得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;
对于短/简单的东西虽然乔的回答是更好,因为它更可读..(对于小文件可能更有效)。
如果您确实想避免执行该操作,则可以将整个输入语句放入一个datastep中的单个循环中。我认为在两个数据步之间用一个宏变量接口将它分开是一个坏主意 - 太多可能会出错。 – Joe 2013-03-11 21:23:03
在大文件的情况下,打开 - 关闭然后再打开同一个文件会伤害(性能方面)吗? SAS编译器是否智能地打开输入文件的一部分(在使用OBS = 1的情况下)并在没有提供这种条件的情况下读取流? – user673218 2013-03-13 07:19:31