SAS占位符值

时间:2018-04-26 17:55:26

标签: merge group-by sas left-join sas-studio

我希望在我的SAS代码中有一个灵活的导入结构。 excel的导入表如下所示:

data have;
input Fixed_or_Floating $ asset_or_liability $ Base_rate_new;
datalines;

FIX A 10
FIX L Average Maturity
FLT A 20
FLT L Average Maturity
;
run;

我正在使用的原始数据集如下所示:

data have2;
input ID Fixed_or_Floating $ asset_or_liability $ Base_rate;
datalines;

1 FIX A 10
2 FIX L 20
3 FIX A 30
4 FLT A 40
5 FLT L 30
6 FLT A 20
7 FIX L 10
;
run;

只有当新利率由债券的平均到期时间确定时,才会在excel文件中存在占位符“平均到期日”。我有一个单独的功能,允许我搜索,然后离开加入新的基本费率取决于最近的利率。这方面的一个例子是,如果债券的到期日为10年,我将使用10年的利率。

所以我的问题是,如何使用类似的代码执行简单的合并:

proc sort data = have;
by fixed_or_floating asset_or_liability;
run;

proc sort data = have2;
by fixed_or_floating asset_or_liability;
run;

data have3 (drop = base_rate);
merge have2 (in = a)
      have1 (in = b);
by fixed_or_floating asset_or_liability;

run;

目前的问题是我的占位符值没有读入,我需要它成为一个单词,因为这是excel在其查找表中的工作方式 - 然后我使用if语句,如

if base_rate_new = "Average Maturity" then do;

(Insert existing Function Here)

end;

请使用占位符函数导入excel,谢谢。

TIA。

1 个答案:

答案 0 :(得分:0)

我不能100%确定这种行为是否与您从excel导入数据时的数据显示方式相符,但如果我运行您的代码来创建have,我会得到:

NOTE: Invalid data for Base_rate_new in line 145 7-13.
RULE:      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+--
145        FIX L Average Maturity
Fixed_or_Floating=FIX asset_or_liability=L Base_rate_new=. _ERROR_=1 _N_=2
NOTE: Invalid data for Base_rate_new in line 147 7-13.
147        FLT L Average Maturity
Fixed_or_Floating=FLT asset_or_liability=L Base_rate_new=. _ERROR_=1 _N_=4
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.HAVE has 4 observations and 3 variables.

基本上它是说当你试图将字符串作为数字导入时它不能这样做,所以它将它们留作空值。如果我们打印表格,我们可以看到空值:

proc print data=have;
run;

结果:

Fixed_or_    asset_or_      Base_
Floating     liability    rate_new

   FIX           A           10
   FIX           L            .
   FLT           A           20
   FLT           L            .

假设这确实是您的数据的样子,那么我们可以使用合并功能来实现您的目标。

data have3 (drop = base_rate);
  merge have2 (in = a)
        have (in = b);
  by fixed_or_floating asset_or_liability;
  base_rate_new = coalesce(base_rate_new,base_rate);
run;

这样做的结果给了我们这个表:

       Fixed_or_    asset_or_      Base_
 ID    Floating     liability    rate_new

  1       FIX           A           10
  3       FIX           A           10
  2       FIX           L           20
  7       FIX           L           20
  4       FLT           A           20
  6       FLT           A           20
  5       FLT           L           30

coalesce函数基本上返回它可以在传递给它的参数中找到的第一个非null值。因此,当base_rate_new已有值时,它会使用该值,如果不是,则会使用base_rate字段。