sas 如何查找第n个观测量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sas 如何查找第n个观测量相关的知识,希望对你有一定的参考价值。
参考技术A 比如找到第2,4,6个观测值data need;
do _n_ = 2, 4, 6;
set sashelp.class point=_n_;
output;
end;
stop;
run;本回答被提问者和网友采纳
SAS - 如何从数据集中获取最后的“n”个观察结果?
【中文标题】SAS - 如何从数据集中获取最后的“n”个观察结果?【英文标题】:SAS - How to get last 'n' observations from a dataset? 【发布时间】:2013-04-16 18:33:21 【问题描述】:如何仅使用原始数据集的最后 n 个观察值从另一个数据集创建 SAS 数据集。当您知道 n 的值时,这很容易。如果我不知道'n'怎么办?
【问题讨论】:
你不知道'n'是什么意思?您将如何找出“n”的值 - 它是数据集变量、宏变量还是参数? 【参考方案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;
【讨论】:
以上是关于sas 如何查找第n个观测量的主要内容,如果未能解决你的问题,请参考以下文章
如果 _N_ = 1 条件返回 true,即使在 SAS 中设置的数据集为空(零观测值)