【问题标题】:Get the current observation count in SAS获取 SAS 中的当前观察计数
【发布时间】:2013-03-11 14:21:17
【问题描述】:

我有一个文件,其中第一行是包含一些元数据信息的标题行。

如何获得 SAS 处理器正在处理的当前观察数(比如第一次观察 =1),以便我可以放入一个 IF 子句来处理这种特殊的数据行。

跟进:我想处理第一行并将其中一个列值保留在局部变量中以供进一步处理。我不想在我的最终输出中保留这条线。这可能吗?

【问题讨论】:

    标签: sas


    【解决方案1】:

    自动变量_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 表示不会每次通过数据步骤循环将变量重置为丢失,因此您可以进一步访问它。

    【讨论】:

      【解决方案2】:

      如果您正在阅读一个特别大的文本文件,您可能希望避免每次迭代都必须执行 (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;
      

      不过,对于简短/简单的东西,Joe 的答案更好,因为它更具可读性..(对于小文件可能更有效)。

      【讨论】:

      • 如果您真的想避免执行该操作,您可以将整个输入语句放入一个数据步内的单个循环中。我认为将其分隔为两个数据步骤并在它们之间使用宏变量接口是一个坏主意 - 太多可能会出错。
      • 在大文件的情况下,打开 - 关闭然后再次打开同一个文件是否会伤害(性能方面)?如果没有提供这样的条件,SAS 编译器会智能打开输入文件的一部分(如果使用 OBS=1)并读取流吗?
      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多