1

我正在处理一些债券数据,我希望离开加入利率预测。我的债券日期数据集如下所示:

data have;
input ID Vintage Reference_Rate Base2017;
Datalines;

1    2017    LIBOR_001M    0.01
1    2018    LIBOR_001M    0.01
1    2019    LIBOR_001M    0.01
1    2020    LIBOR_001M    0.01

2    2017    LIBOR_003M    0.012
2    2018    LIBOR_003M    0.012
2    2019    LIBOR_003M    0.012
2    2020    LIBOR_003M    0.012

3    2017    LIBOR_006M    0.014
3    2018    LIBOR_006M    0.014
3    2019    LIBOR_006M    0.014
3    2020    LIBOR_006M    0.014
;
run;

我希望左连接(甚至完全连接)的第二个数据集看起来像

data have2;
input Reference_rate Base2018 Base2019 Base2020;
datalines;

LIBOR_001M 0.011 0.012 0.013
LIBOR_003M 0.013 0.014 0.015
LIBOR_006M 0.015 0.017 0.019
;
run;

我得到的数据集将年份折叠成 1 并弄乱了我一直在运行的其余分析,看起来像

data dontwant;
input ID Vintage Reference_rate Base2017 Base2018 Base2019 Base2020;
datalines;
      1    2017    LIBOR_001M    0.01    0.011    0.012    0.013
      2    2017    LIBOR_003M    0.012   0.013    0.014    0.015
      3    2017    LIBOR_006M    0.014   0.015    0.017    0,019
run;

我想要的数据集看起来像这样

data want;
input input Reference_rate Base2018 Base2019 Base2020;
datalines;

1    2017    LIBOR_001M    0.01    0.011    0.012    0.013
1    2018    LIBOR_001M    0.01    0.011    0.012    0.013
1    2019    LIBOR_001M    0.01    0.011    0.012    0.013
1    2020    LIBOR_001M    0.01    0.011    0.012    0.013

2    2017    LIBOR_003M    0.012   0.013    0.014    0.015
2    2018    LIBOR_003M    0.012   0,013    0.014    0.015
2    2019    LIBOR_003M    0.012   0.013    0.014    0.015
2    2020    LIBOR_003M    0.012   0.013    0.014    0.015

3    2017    LIBOR_006M    0.014   0.015   0.017    0.019
3    2018    LIBOR_006M    0.014   0.015   0.017    0.019
3    2019    LIBOR_006M    0.014   0.015   0.017    0.019
3    2020    LIBOR_006M    0.014   0.015   0.017    0.019
;
run;

我一直在使用的代码是一个非常标准的 proc sql

PROC SQL;
CREATE TABLE want AS
SELECT a.*, b.*
FROM have A LEFT JOIN have2 B
ON A.reference_rate = B.reference_rate
ORDER BY reference_rate;
QUIT;
4

1 回答 1

1

避免使用 Select * 是一种很好的做法,因为它有利于查询性能并避免两个表中具有相同列名的情况。

我运行了您的相同代码,它运行良好,除了一个警告,因为您使用的是 select a.* & b.*; 您在两个表中都有字段“Reference_Rate”。

解决方案:

PROC SQL;
CREATE TABLE want AS 
SELECT 
    a.ID,
    a.Vintage,
    a.Reference_Rate,
    b.Base2018, 
    b.Base2019, 
    b.Base2020
FROM have A LEFT JOIN have2 B
ON A.reference_rate = B.reference_rate
ORDER BY reference_rate;
QUIT;

提示:

您可以使用以下代码将 SAS 表值打印到日志Put _ALL_ 中,它不会创建表,它只会将表打印到日志中,这有利于调试小表。

data _null_;
set want;
put _all_;
run;

日志:

ID=1 Vintage=2019 Reference_Rate=LIBOR_001M Base2018=0.011 Base2019=0.012 Base2020=0.013 _ERROR_=0 _N_=1
ID=1 Vintage=2020 Reference_Rate=LIBOR_001M Base2018=0.011 Base2019=0.012 Base2020=0.013 _ERROR_=0 _N_=2
ID=1 Vintage=2017 Reference_Rate=LIBOR_001M Base2018=0.011 Base2019=0.012 Base2020=0.013 _ERROR_=0 _N_=3
ID=1 Vintage=2018 Reference_Rate=LIBOR_001M Base2018=0.011 Base2019=0.012 Base2020=0.013 _ERROR_=0 _N_=4
ID=2 Vintage=2019 Reference_Rate=LIBOR_003M Base2018=0.013 Base2019=0.014 Base2020=0.015 _ERROR_=0 _N_=5
ID=2 Vintage=2018 Reference_Rate=LIBOR_003M Base2018=0.013 Base2019=0.014 Base2020=0.015 _ERROR_=0 _N_=6
ID=2 Vintage=2017 Reference_Rate=LIBOR_003M Base2018=0.013 Base2019=0.014 Base2020=0.015 _ERROR_=0 _N_=7
ID=2 Vintage=2020 Reference_Rate=LIBOR_003M Base2018=0.013 Base2019=0.014 Base2020=0.015 _ERROR_=0 _N_=8
ID=3 Vintage=2020 Reference_Rate=LIBOR_006M Base2018=0.015 Base2019=0.017 Base2020=0.019 _ERROR_=0 _N_=9
ID=3 Vintage=2019 Reference_Rate=LIBOR_006M Base2018=0.015 Base2019=0.017 Base2020=0.019 _ERROR_=0 _N_=10
ID=3 Vintage=2018 Reference_Rate=LIBOR_006M Base2018=0.015 Base2019=0.017 Base2020=0.019 _ERROR_=0 _N_=11
ID=3 Vintage=2017 Reference_Rate=LIBOR_006M Base2018=0.015 Base2019=0.017 Base2020=0.019 _ERROR_=0 _N_=12
于 2018-03-23T09:50:05.140 回答