sas - SAS 识别前三年
问题描述
我使用以下代码来识别和输出前三年。为了提供更多详细信息,该示例包括多个 Person ID,并且每个 Person ID 都有多年的观察结果。最终样本将仅保留至少具有前三年的人员 ID(例如 2001 2002 2003)。
data have3 ;
set have2;
by personid;
set have2 ( firstobs = 2 keep = year rename = (year = _year2) )
have2 ( obs = 1 drop = _all_ );
_year2 = ifn( last.personid, (.), _year2 ); /*output the value of next year*/
set have2 ( firstobs = 3 keep = year rename = (year = _year3) )
have2 ( obs = 2 drop = _all_ );
_year3 = ifn( last.personid, (.), _year3 ); /*output the value of the year after the next year*/
_prev1 = ifn( first.personid, (.), lag(year) ); /*output the value of previous year*/
_prev2 = ifn( first.personid, (.), lag2(year) );/*output the value of the year before the previous year*/
if (year-2 eq _prev1-1 eq _prev2) or
(year+2 eq _year2+1 eq _year3) or
(year eq _year2-1 eq _prev1+1) then output;
run;
这段代码在大多数情况下都很好。但是,我的示例有一些棘手的情况。下图显示了其中一种情况。个人 ID 488 只有两个观察值(1994 年和 1995 年)。不幸的是,下一个 Person ID 489 的第一年是 1996 年。因此,ID488 Year1994 的 _year3 是 1996 年,这使得它year+2 eq _year2+1 eq _year3
成为真的。结果,ID488 Year1994 也输出到最终样本。我该如何改进代码以避免这种情况?谢谢!
解决方案
将 id 变量也保留在您的前瞻 SET 语句中可能会更容易。
set have2(firstobs=2 keep=personid year rename=(personid=personid2 year=_year2))...
set have2(firstobs=3 keep=personid year rename=(personid=personid3 year=_year3))...
然后,您可以确保下一个和下一个下一个记录实际上是针对相同的 PERSONID。
if personid ne personid2 then _year2=.;
if personid ne personid3 then _year3=.;
你的回顾变量也是如此。
_prev1=lag(year);
_prev2=lag2(year);
if personid ne lag(personid) then _prev1=.;
if personid ne lag2(personid) then _prev2=.;
推荐阅读
- firebase - 如何从 Cloud_Firestore 获取单个文档数据到我的变量?
- node.js - 节点js响应加载资源失败:服务器响应状态为404(未找到)
- javascript - 将 dom 操作放在 redux reducer 中是个坏主意?
- python - 如何从另一个列表中删除空列表?
- user-interface - 使用 backgroundWorker 时 C++ GUI 写入文本框
- oracle - Oracle 表单圆角按钮
- javascript - 使用 vanilla JS 从页面中删除渲染图像?
- android - Kotlin 协程 mvvm 从模型返回值
- php - laravel 为 foreach() 提供的一对多无效参数
- sql - 如何将 2 个条件计数查询组合成一个查询?