company issue datadate shares price mv_issue mv_day
4439 04W 19921006 1100 120 132000 454800
4439 05W 19921006 1400 115 161000 454800
4439 06W 19921006 800 101 80800 454800
4439 07W 19921006 900 90 81000 454800
**4439 04W 19921006 1100 120 132000 455500**missing
4439 05W 19921007 1400 116 162400 455500
4439 06W 19921007 800 99 79200 455500
4439 07W 19921007 900 91 81900 455500
5510 02W 19940126 50 5 250 1090
5510 03W 19940126 120 7 840 1090
5510 02W 19940127 50 5 250 1210
5510 03W 19940127 120 8 960 1210
**记录实际上已丢失。如何让SAS填写缺失的记录,其中包含股票发行04W交易的最新信息?
我正在尝试计算市场价值,因为每个独特问题的股票乘以价格。然后我想在那天的所有问题上总结mv_issue。我这样做是为了表明在19921006天,总市值应该是454800.但是在1992/10/07的日子里,04W的记录不存在,因为这个问题当天没有交易。如果我将之前的交易活动替换为04W,就像我在此数据集中所做的那样,mv_day将是455500.如何创建此缺失记录,以便当天的总数将包括该公司的所有可能的股票发行(04W)使用前一天的信息,05W,06W和07W)? 谢谢你的帮助。
答案 0 :(得分:0)
老问题我偶然发现了,但是如果有人看到这个问题,我想我会回答proc扩展的替代方案。
如果所需的操作足够简单,我可以尽可能地使用数据步骤。最后的观察结果(LOCF)在我看来很简单。如果您不想要,您不需要将日期列更新为真正的SAS日期格式,尽管我个人推荐它。只需要任何排序索引。给定数据集RAW,如下所示:
DATEC | DATEN | VAL
01JAN2016T12:30 1767270600 1
01JAN2016T14:00 1767276000 2
01JAN2016T19:00 1767294000 5
02JAN2016T08:00 1767340800 3
06JAN2016T12:00 1767700800 .
21JAN2016T21:00 1769029200 8
03FEB2016T09:00 1770109200 10
13FEB2016T12:00 1770984000 6
21FEB2016T09:30 1771666200 .
15MAR2016T12:00 1773662400 .
20MAR2016T12:00 1774094400 5
这是我编写的快速代码来处理这个问题。
proc sort data=RAW; by daten; run;
data LOCF;
retain LOCF;
set RAW;
if val ne . then LOCF=val;
if val=. then val=LOCF;
drop LOCF;
run;
结果数据集LOCF如下所示:
DATEC | DATEN | VAL
01JAN2016T12:30 1767270600 1
01JAN2016T14:00 1767276000 2
01JAN2016T19:00 1767294000 5
02JAN2016T08:00 1767340800 3
06JAN2016T12:00 1767700800 3**
21JAN2016T21:00 1769029200 8
03FEB2016T09:00 1770109200 10
13FEB2016T12:00 1770984000 6
21FEB2016T09:30 1771666200 6**
15MAR2016T12:00 1773662400 6**
20MAR2016T12:00 1774094400 5
**This value was carried forward.
公司的第一条记录是否有可能缺失值?我猜不是,但如果是这样(并且可能只是为了安全起来),请考虑这一点,以便之前公司的数据不会被推进:
data LOCF;
retain LOCF;
set RAW;
by company daten;
if val ne . then LOCF=val;
if ^first.company & val=. then val=LOCF;
drop LOCF;
run;