【问题标题】:SAS Placeholder valueSAS 占位符值
【发布时间】:2018-04-26 17:55:25
【问题描述】:

我希望在我的 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;

占位符“Average Maturity”仅在新利率由债券的平均期限确定时才存在于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。

【问题讨论】:

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


    【解决方案1】:

    我不能 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 函数基本上返回它可以在您传递给它的参数中找到的第一个非空值。因此,当base_rate_new 已经有一个值时,它会使用该值,如果没有,则使用base_rate 字段。

    【讨论】:

    • 您好,非常感谢您的回答,非常合理!不幸的是,我正在寻找一种方法来制作占位符/字符,以便它可以在下一个函数中用作我的下一个程序填充的指示器。我认为解决此问题的最佳方法是将其留空,然后执行 if base_rate_new = 。然后做; (在此处插入我的下一个程序)结束;
    • 没问题。请注意,您不能让一列同时包含数字和字符值。您可以将自定义格式应用于数字列,然后在下一个程序中检查自定义格式的结果,尽管这会实现您想要的(我认为)。
    • @78282219 或者让您的新程序进行检查:if base_rate_new eq . then do; 也可以在数字列上工作。
    • 你的数字和字符是正确的,所以我决定使用 -999 作为占位符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2013-09-13
    相关资源
    最近更新 更多