【问题标题】:SAS - How to get last 'n' observations from a dataset?SAS - 如何从数据集中获取最后的“n”个观察结果?
【发布时间】:2013-04-16 18:33:21
【问题描述】:

如何仅使用原始数据集的最后 n 个观察值从另一个数据集创建 SAS 数据集。当您知道 n 的值时,这很容易。如果我不知道'n'怎么办?

【问题讨论】:

  • 你不知道'n'是什么意思?您将如何找出“n”的值 - 它是数据集变量、宏变量还是参数?

标签: sas dataset


【解决方案1】:

如果数据集很大,您可能不想读取整个数据集。相反,您可以尝试先读取数据集中的观察总数的构造。因此,如果您想获得最后的观察结果:

data t;
  input x;
datalines;
1
2
3
4
;

%let dsid=%sysfunc(open(t));
%let num=%sysfunc(attrn(&dsid,nlobs));
%let rc=%sysfunc(close(&dsid));
%let number = 2;

data tt;
set t (firstobs =  %eval(&num.-&number.+1));
run;

【讨论】:

    【解决方案2】:

    为了多样化,这里有另一种方法(不一定更好)

    %let obswant=5;
    
    proc sql noprint;
    select nlobs-&obswant.+1 into :obscalc
    from dictionary.tables
    where libname='SASHELP' and upcase(memname)='CLASS';
    quit;
    
    data want;
    set sashelp.class (firstobs=&obscalc.);
    run;
    

    【讨论】:

    • 注意:使用 select..into 时要指定格式,否则该值的格式为 BEST8.,当您选择一个 >= 100,000,000 的值时会导致奇怪的错误(它的格式为指数表示法,导致四舍五入)。
    【解决方案3】:

    使用 Joe 的宏变量示例来指定您想要的观察次数,这是另一个答案:

    %let obswant = 10;
    data want;
       do _i_=nobs-(&obswant-1) to nobs;
          set have point=_i_ nobs=nobs;
          output;
          end;
       stop;  /* Needed to stop data step */
    run;
    

    这应该会更好,因为它只读取您想要的特定观察结果。

    【讨论】:

    • 我很好奇“这应该表现得更好”的条件。我怀疑是其中的一些;随机访问不如顺序访问快,所以那里有一些损失。如果我有时间可以测试一下。我怀疑如果您正在使用大多数观察结果,那么按顺序执行会更快,但如果它是一个大型数据集并且您想要少量观察结果,那么随机 = 访问会更快。让我希望 SAS 能够以相反的顺序打开数据集,而无需先对其进行排序。
    • @Joe 想象一个有 100 万个 obs 的数据集,你想要“最后一个”10 个。使用这种技术,只执行 10 个“输入”操作。仅使用 NOBS 值需要 100 万次“输入”操作。根据数据集的“宽度”程度,这种差异可能非常显着。
    • 是的,我当然看到这可能会更快。我很好奇它在哪一点上更快/更慢(即,数据集的大小,被提取的数据百分比 - 1MM 中的 10 个当然会更快,但是 1MM 中的 500k 呢?)
    【解决方案4】:

    这假设您有一个宏变量,表示您想要多少个观察值。 NOBS 会告诉您当前数据集中的观察次数,而无需阅读全部内容。

    %let obswant=5;
    data want;
    set sashelp.class nobs=obscount;
    if _n_ gt (obscount-&obswant.);
    run;
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多