sas - 如何计算 SAS 中宏变量的数据类型

标签 sas sas-macro

如何在日志中打印出宏变量的数据类型

%macro mymacro(dt2);


    %LET c_mth = %SYSFUNC(intnx(month,&dt2.d,-1,e),date9.) ;
    %put &c_mth;

%mend;

mymacro('01sep2014')

我使用 %let 或 into 分配了一堆宏变量:
我的问题是我试图在日期上做一堆 bool 条件,但我怀疑我的一些变量是字符串,有些是日期
我已经在我的代码中转换了它们,但是要三重检查肯定有一种方法可以将某些内容返回到日志中

我想要类似于在 R 中使用 str() 或 mode() 或 is.numeric() 的东西

最佳答案

H,

SAS 宏语言很奇怪。 :)

正如 Reeza 所说,宏变量没有类型,它们都是文本。

但是,如果您使用 bool 逻辑(%IF 语句),并且两个操作数都是整数,则宏语言将进行数字比较而不是字符比较。

因此,您可以使用 INPUTN() 函数将日期字符串转换为 SAS 日期(自 01Jan1960 以来的天数),然后进行比较。这是一个示例,从您的代码中跳出:

%macro mymacro(dt1,dt2);
  %local c_mth1 c_mth2 n_mth1 n_mth2;

  %let c_mth1 = %sysfunc(intnx(month,&dt1.d,-1,e),date9.) ;
  %let c_mth2 = %sysfunc(intnx(month,&dt2.d,-1,e),date9.) ;
  %let n_mth1 = %sysfunc(inputn(&c_mth1,date9.)) ;
  %let n_mth2 = %sysfunc(inputn(&c_mth2,date9.)) ;

  %put &c_mth1 -- &n_mth1;
  %put &c_mth2 -- &n_mth2;

  %if &n_mth1<&n_mth2 %then %put &c_mth1 is before &c_mth2;
  %else %put &c_mth1 is NOT before &c_mth2;

%mend;

从示例调用记录:
236  %mymacro('01feb1960','01mar1960')
31JAN1960 -- 30
29FEB1960 -- 59
31JAN1960 is before 29FEB1960

——问。

关于sas - 如何计算 SAS 中宏变量的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467405/

相关文章:

sas - 如何防止 CATx 函数计算表达式

stored-procedures - SAS:获取创建的 DBF 文件的文件大小

excel - SAS 使用 DDE 保护 Excel 工作表

sql - 是否可以使用 SAS (PROC SQL) 进行不区分大小写的 DISTINCT?

append - SAS append 错误

r - 所有可能组合的乘积的编码和

SAS 做循环 : use loop variable inside the loop to create lagged variables

date - 从宏变量中减去日期

基于值的 SAS 串联

merge - 是否可以在 SAS Data Step 中使用不同的键将两个以上的数据集合并在一起?