微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我是否需要在SAS中使用if语句创建变量?

如何解决我是否需要在SAS中使用if语句创建变量?

我需要在SAS中编写代码以替代Access。由于Access / sql和SAS使用“ if”的区别,该代码中有一部分我不知道该怎么做。

在Access中不需要“ if”命令创建新变量时,在SAS中我们必须创建它。

在Access中,代码是这样的:

(IIf(date2 > par_final,par_final,date2) - 
IIf(date1 > par_initial,par_initial,date1))/365 as exposure

所有变量均为日期格式。当我用SAS代码编写代码时,我必须创建一个新变量。例如:

If date2 > par_final then 
        Field1 = par_final; Else Field1 = date2;

但是,我想创建Just Exposure。我不需要创建任何其他变量。

如何用SAS代码编写?

我认为首先使用if条件创建第一个变量,再使用if之后的if创建第二个变量。然后,我制作(field1-field2)/ 365创建曝光并拖放field1和field2。

谁能给我一个更好的建议?有没有不创建这些变量的方法吗?

谢谢。

解决方法

MS Access的SQL方言中来自标准SQL的divergences中的一个是IIF函数(不要与IF运算符混淆),大多数数据库方言都使用{{1} }。

CASE

因此,以上内容可以使用CASE表达式进行翻译,并且可以在任何兼容的ANSI-92 SQL编译器(包括SAS的(IIf(date2 > par_final,par_final,date2) - IIf(date1 > par_initial,par_initial,date1))/365 as exposure )中运行:

proc sql
,

SAS具有条件逻辑功能IFCIFN,它们根据逻辑评估分别返回字符或数字值。 SAS日期值是从时期01-JAN-1960开始的连续整数,因此您可以继续使用减法来计算暴露天数。

尝试更换

(IIf(date2 > par_final,date2) - 
IIf(date1 > par_initial,date1))/365 as exposure

使用

( IFN(date2 > par_final,date2) 
  - 
  IFN(date1 > par_initial,date1)
) / 365 as exposure label="Years of exposure"

示例

data have;
input ini d1 d2 fin;
datalines;
1 2 3 4
2 1 3 4
1 2 4 3
2 1 4 3
;


* Expression in SQL;

proc sql;
  create table foo as 
  select
    ( ifn ( d2 > fin,fin,d2 )
      - 
      ifn ( d1 > ini,ini,d1 )
    )
  as diff label = 'Difference of IFNs'
  from have
  ;
quit;

* Expression in DATA Step;

data foo_also;
  set have;

  diff = ( ifn ( d2 > fin,d2 )
           - 
           ifn ( d1 > ini,d1 )
         );

  attrib diff label='Difference of IFNs';
run;

尝试使用函数MIN代替IFN

   exposure = (min(d2,fin) - min(d1,ini)) / 365;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。