SAS-如何获得最后的';n';来自数据集的观察结果?

SAS-如何获得最后的';n';来自数据集的观察结果?,sas,dataset,Sas,Dataset,如何仅使用原始数据集的最后n个观测值从另一个数据集创建SAS数据集。当你知道n的值时,这很容易。如果我不知道“n”如何做到这一点?这假设您有一个宏变量,该变量表示您需要多少个观测值。NOBS告诉您当前数据集中的观测值数量,而不读取全部内容 %let obswant=5; data want; set sashelp.class nobs=obscount; if _n_ gt (obscount-&obswant.); run; 使用Joe的宏变量示例来指定所需的观察数,下面是另一个答

如何仅使用原始数据集的最后n个观测值从另一个数据集创建SAS数据集。当你知道n的值时,这很容易。如果我不知道“n”如何做到这一点?

这假设您有一个宏变量,该变量表示您需要多少个观测值。NOBS告诉您当前数据集中的观测值数量,而不读取全部内容

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

使用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;

由于它只读取您想要的特定观察结果,因此性能应该更好。

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


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

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;

你不知道“n”是什么意思?您将如何找出“n”的值?它是一个数据集变量、一个宏变量还是一个参数?我很好奇“这应该表现得更好”的条件。我怀疑这是其中的一部分;随机存取不如顺序存取快,因此会有一些损失。如果我有时间,我可以试试看。我怀疑,如果您使用的是大多数观察结果,那么按顺序执行会更快,但如果是一个大型数据集,并且您需要少量观察结果,则执行random=access会更快。让我希望SAS能够以相反的顺序打开数据集,而不必先对其进行排序。@Joe想象一个有100万OB的数据集,你想要“最后”10个。使用此技术,仅执行10个“输入”操作。仅使用NOBS值需要100万次“输入”操作。这取决于数据集的“宽度”,这种差异可能非常显著。对,我当然认为这可能更快。我很好奇它在哪一点上更快/更慢(即,数据集的大小,被提取的数据的百分比是多少?当然,从1MM中提取10%会更快,但是从1MM中提取500k会更快吗?)注意:您想在使用select..into时指定格式,否则该值将被格式化为BEST8.,当您选择一个大于等于100000000的值时,这将导致奇怪的错误(它的格式是指数表示法,导致四舍五入)。
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;