【问题标题】:SAS filling rowsSAS 填充行
【发布时间】:2015-08-15 12:20:49
【问题描述】:
data have;
infile cards missover;
input scrssn :$11. year FIPS :$5.;
cards;
111-22-3333 2008 
111-22-3333 2009 
111-22-3333 2010 09990
111-22-3333 2011 
111-22-3333 2012 08880
111-22-3333 2013 
111-22-3333 2014 
333-44-5555 2009 
333-44-5555 2010 67897
333-44-5555 2011 
333-44-5555 2012 56789
333-44-5555 2013 
333-44-5555 2014 67899
333-44-5555 2015
333-44-5555 2016
333-44-5555 2017
333-44-5555 2018
;
run;

我想要数据

111-22-3333 2008 
111-22-3333 2009 
111-22-3333 2010 09990
111-22-3333 2011 09990
111-22-3333 2012 08880
111-22-3333 2013 
111-22-3333 2014 
333-44-5555 2009 
333-44-5555 2010 67897
333-44-5555 2011 67897
333-44-5555 2012 56789
333-44-5555 2013 56789
333-44-5555 2014 67899
333-44-5555 2015
333-44-5555 2016
333-44-5555 2017
333-44-5555 2018

对于每个 scrssn,我想用前一个 FIPS 填充后续 FIPS,但在可用 FIPS 的最后一行停止

非常感谢!!!

【问题讨论】:

  • 到目前为止,您有什么尝试过的,在哪里遇到了具体问题?如果您展示解决问题的尝试,而不仅仅是说明要完成的任务,我们将不胜感激。一些开始的代码可能会有所帮助。

标签: sas


【解决方案1】:

首先找出该组的最后一个非缺失值在哪里。然后将前一个值结转,但只到最后一个非缺失值的点。

data want ;
  do _n_=1 by 1 until (last.scrssn) ;
    set have;
    by scrssn ;
    if fips ne . then lastfips=_n_ ;
  end;
  do _n_=1 by 1 until (last.scrssn) ;
    set have;
    by scrssn ;
    if fips = . and _n_ < lastfips then fips=previous;
    output;
    previous = fips;
  end;
  drop lastfips previous;
run;

【讨论】:

    【解决方案2】:

    一个简单的retain 就可以做到这一点......

    数据要; 设置有; 通过 scrsn ; 长度 prevFIPS 5 美元。 ; 保留 prevFIPS '' ; 如果 first.scrssn 然后调用 missing(prevFIPS) ; 如果没有丢失(FIPS) 那么 prevFIPS = FIPS ; 否则 FIPS = prevFIPS ; 跑 ;

    【讨论】:

    • 感谢 chris,但在每个 scrssn 的最后一个 fips 之后,这将继续填充
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多