首页 > 解决方案 > 在面板中查找第一个非缺失的 str 值并使用值按组(SAS 或 PROC SQL)向前和向后填充

问题描述

我有一个包含不平衡观察面板的数据集,我想用最新的非缺失字符串向前和向后填充缺失和/或“错误”的股票代码观察。

id time  ticker_have   ticker_want
------------------------------ 
1   1     ABCDE          YYYYY 
1   2     .              YYYYY 
1   3     .              YYYYY 
1   4     YYYYY          YYYYY   
1   5     .              YYYYY
------------------------------
2   4     .              ZZZZZ
2   5     ZZZZZ          ZZZZZ
2   6     .              ZZZZZ
------------------------------
3   1     .              .
------------------------------
4   2     OOOOO          OOOOO
4   3     OOOOO          OOOOO
4   4     OOOOO          OOOOO

基本上,如果观察已经有一个代码,但是这个代码与最新的非空代码不同,我们使用最新的代码替换这个代码。

到目前为止,我已经设法使用此代码填补缺失的观察结果

proc sql;
create table have as select * from old_have order by id, time desc;
quit;

data want;
  drop temp;
  set have;
  by id;
  /* RETAIN the new variable*/
  retain temp; length temp $ 5;
  /* Reset TEMP when the BY-Group changes */
  if first.id then temp=' ';
  /* Assign TEMP when X is non-missing */
  if ticker ne ' ' then temp=ticker;
  /* When X is missing, assign the retained value of TEMP into X */
  else if ticker=' ' then ticker=temp;
run;

现在我被困在找出我无法使用last.tickeror访问非缺失值的情况下first.ticker......

如何使用DATAPROC SQL或任何其他 SAS 命令来做到这一点?

标签: sqlsas

解决方案


您可以通过多种方式执行此操作,但proc sql使用一些嵌套子查询是一种解决方案。

(从内到外阅读,#1 然后 2 然后 3。如果有帮助,您可以先将每个子查询构建到数据集中)

过程 sql ;
  创建表想要作为
  /* #3 - 匹配 id 上的最后一个代码 */
  选择 a.id、a.time、a.ticker_have、b.ticker_want
  从有一个
       左连接
        /* #2 - id 和最后一个代码 */
       (选择 x.id, x.ticker_have 作为ticker_want
        从有 x
             内部联接
              /* #1 - 每个 id 的最大时间 */
             (选择 id, max(time) 作为 mt
              从有
              哪里不缺(ticker_have)
              按 id 分组)作为 x.id = y.id 上的 y 和 x.time = y.mt)作为 a.id = b.id 上的 b
  ;
退出 ;

推荐阅读