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)?谢谢你的帮助。
偶然发现的老问题,但我想我会回答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;