首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据不同的组将缺失值替换为上一次或下一次观察

根据不同的组将缺失值替换为上一次或下一次观察
EN

Stack Overflow用户
提问于 2016-07-20 21:20:44
回答 1查看 1.8K关注 0票数 1

这里是一个示例数据集。下面的场景表示帐户事务历史记录的列表:

  • 两个客户A和B;
  • 客户A在银行BA和UB有5个账户: 1、2、3、4、5;
  • 客户B在银行WF有2个帐户1,6个;
  • 请注意,银行WF向B发出的帐户ID与A在银行BA的帐户ID相同(这在现实中可能是正确的)。 数据已;输入客户$ Account_id Bank_id $年;数据线;A_1 BA。A 2 UB。A 2012年3 UB A、3 UB。A 4 UB。A 4 UB,2013年A5 UB。B 1 WF 2014 B 1 WF。B 6 WF .;

有些帐户的开户日期缺失,但对于相同的帐户,开放日期应该是相同的。我要做的是用帐户的前一个/以后的值替换丢失的日期(如果有的话);否则,保持它为空。

代码语言:javascript
复制
    data want;
     input Customer $ Account_id Bank_id $ Year;
    datalines;
    A  1  BA    .
    A  2  UB    .
    A  3  UB 2012
    A  3  UB 2012
    A  4  UB 2013
    A  4  UB 2013
    A  5  UB    .
    B  1  WF 2014
    B  1  WF 2014
    B  6  WF    .
    ;

我看了这个例子:How to write first non-missing value to first missing observations很有帮助,但我不能调整它来处理我的案例,因为它有多个组。

EN

回答 1

Stack Overflow用户

发布于 2016-07-20 23:43:25

这应该可以做到:

代码语言:javascript
复制
proc sort data=have;
  by Customer
     Bank_id
     Account_id
     descending Year;
run;

data want;
  set have;
  by Customer Bank_id Account_id;
  retain year_tmp (.);

  if not last.Account_id and Year ne . then year_tmp=Year;
  else if Year = . then Year = year_tmp;
  if last.Account_id then year_tmp = .;

  drop year_tmp;
run;

我们所做的是声明一个retain变量,也就是说,一个将其值从一行保存到下一行的变量。然后使用last标志,我们要么将现有的年份存储在保留变量中(或者将已经存储的值归因于缺少的年份)。最后,我们在每个Account_id的最后一行重置reset变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38491049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档