7

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

4

4 回答 4

8

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

%let obswant=5;
data want;
set sashelp.class nobs=obscount;
if _n_ gt (obscount-&obswant.);
run;
于 2013-04-23T14:01:13.517 回答
4

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

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;
于 2013-04-29T09:11:09.117 回答
4

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

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

于 2013-04-23T14:47:56.127 回答
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;
于 2013-04-23T16:20:45.633 回答