sql - 在面板中查找第一个非缺失的 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.ticker
or访问非缺失值的情况下first.ticker
......
如何使用DATA
或PROC SQL
或任何其他 SAS 命令来做到这一点?
解决方案
您可以通过多种方式执行此操作,但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 ; 退出 ;
推荐阅读
- c# - 编辑:NGINX 反向代理 ASP.NET Core 5.0:localhost:5000 关闭连接但 www.google.com 有效
- tensorflow - 我收到“来自未知节点的请求张量连接:“keras_layer_input:0””。加载keras模型时出错
- ionic-framework - Ionic appflow 实时更新不会出现在设备上
- javascript - 从 php 返回一个可迭代对象到 Ajax
- javascript - “text/html - npm http-server”的非 JavaScript MIME 类型
- c# - 从 .doc 格式的 word 文档的 base64String 转换为 png(mime application/octet-stream)
- loops - 为什么我的 for 循环 (i) 停止了 50,000 左右?
- lua - 重复直到循环后如何设置变量?
- javascript - 如何通过更改全局变量来更改 SurveyJS JSON 中的变量
- scala - 如何在火花中复制数据框中的前n行?