Sas 从数据集合中的宏函数返回并分配全局值
不太确定执行以下操作的最佳方法-我想从数据步骤中调用宏函数,将现有列中的值作为参数传递,并将宏函数生成的值分配给新列。我对任何方法都持开放态度——PROC-SQL、CALL-EXECUTE等等Sas 从数据集合中的宏函数返回并分配全局值,sas,Sas,不太确定执行以下操作的最佳方法-我想从数据步骤中调用宏函数,将现有列中的值作为参数传递,并将宏函数生成的值分配给新列。我对任何方法都持开放态度——PROC-SQL、CALL-EXECUTE等等 %macro simple(x=); %global value; %let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same)); %put &value; %mend simple; %simp
%macro simple(x=);
%global value;
%let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same));
%put &value;
%mend simple;
%simple(x=1);
data have;
do x = 1 to 15;
output;
end;
run;
data want;
data have;
newdate = %simple(x);
run;
请注意对%SIMPLE的更改及其调用位置。“解决”适用于这种情况,但
%复杂:-)不会。此外,最好不用调用宏即可完成此操作—所有操作都可以在数据步骤中完成。我希望你能更好地利用这一点,而不是工作保障
%macro simple(x=);
%sysfunc(intnx(month, %sysfunc(today()), &x, same))
%mend simple;
%put NOTE: %simple(x=1);
data have;
do x = 1 to 15;
output;
end;
run;
data want;
set have;
newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
format newdate date9.;
run;
proc print;
run;
请注意对%SIMPLE的更改及其调用位置。“解决”适用于这种情况,但
%复杂:-)不会。此外,最好不用调用宏即可完成此操作—所有操作都可以在数据步骤中完成。我希望你能更好地利用这一点,而不是工作保障
%macro simple(x=);
%sysfunc(intnx(month, %sysfunc(today()), &x, same))
%mend simple;
%put NOTE: %simple(x=1);
data have;
do x = 1 to 15;
output;
end;
run;
data want;
set have;
newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
format newdate date9.;
run;
proc print;
run;
如果您想在语句的中间使用宏,例如:
newdate = %simple(x);
然后宏只能发出语句的一部分。这不是分号
在本例中,如果定义宏以生成对INTNX()的调用,则可以在赋值语句中以这种方式使用它
%macro simple(value);
intnx('month',%sysfunc(today()),&value,'same')
%mend simple;
因此,如果今天()是2018年11月20日,那么您在数据步骤中有效地运行了这个有效的SAS语句
newdate = intnx('month',21508,x,'same') ;
注意变量X的名称是如何传递给宏的,以及在生成的SAS代码段中使用的
当然,如果您想尝试在SAS语句之外使用宏,那么宏现在是无用的 > P>如果您想在语句的中间使用宏,例如:
newdate = %simple(x);
然后宏只能发出语句的一部分。这不是分号
在本例中,如果定义宏以生成对INTNX()的调用,则可以在赋值语句中以这种方式使用它
%macro simple(value);
intnx('month',%sysfunc(today()),&value,'same')
%mend simple;
因此,如果今天()是2018年11月20日,那么您在数据步骤中有效地运行了这个有效的SAS语句
newdate = intnx('month',21508,x,'same') ;
注意变量X的名称是如何传递给宏的,以及在生成的SAS代码段中使用的
当然,如果您想尝试在SAS语句之外使用宏,那么宏现在是无用的 你能改用PROC FCMP吗?DOSUBL可能会在同一会话中返回,但调用EXECUTE是在数据步骤结束之后,因此不会执行您想要的操作。您好!如果你能提供一个有帮助的例子,我也会同时研究PROC FCMP。你上面的例子有代表性吗?这个函数真的是你想要做的吗?它确实更简单,但我认为它抓住了我的问题。如果解决方案似乎不符合我的实际情况,我可以尝试更新我的帖子。不要在你指的
set
位置使用data
。将格式添加到新变量中,使其以可读格式打印日期可能很有用。可以改用PROC FCMP吗?DOSUBL可能会在同一会话中返回,但调用EXECUTE是在数据步骤结束之后,因此不会执行您想要的操作。您好!如果你能提供一个有帮助的例子,我也会同时研究PROC FCMP。你上面的例子有代表性吗?这个函数真的是你想要做的吗?它确实更简单,但我认为它抓住了我的问题。如果解决方案似乎不符合我的实际情况,我可以尝试更新我的帖子。不要在你指的set
位置使用data
。在新变量中添加一种格式,以便它以可读的格式打印日期,这可能很有用。您是否介意在数据步骤中演示如何实现这一点?我似乎也无法做到这一点——如果必要的话,我可以展示我在帖子中尝试过的内容。input(resolve(…)
是一种我不知道的编码模式——我肯定我会不必要地滥用它,在数据步骤中而不是在宏代码中调用intnx()
,只是不要将其包装在%sysfunc()中
.Hi@Tom-我已经用示例代码(在底部)编辑了我的文章-它没有给我预期的输出…您介意在数据步骤中演示如何实现这一点吗?我似乎也无法做到这一点——如果必要的话,我可以展示我在帖子中尝试过的内容。input(resolve(…)
是一种我不知道的编码模式——我肯定我会不必要地滥用它,在数据步骤中而不是在宏代码中调用intnx()
,只是不要将其包装在%sysfunc()中
.Hi@Tom-我用示例代码编辑了我的文章(在底部)-它没有给我预期的输出…太酷了!在现实生活中,我使用的是一个多行宏函数,所以这两个选项都很好这很酷!在现实生活中,我使用的是一个多行宏函数,所以这两个选项都很好