如何解决我是否需要在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具有条件逻辑功能IFC
和IFN
,它们根据逻辑评估分别返回字符或数字值。 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 举报,一经查实,本站将立刻删除。