使用数据步骤语法创建自定义函数
语法:
OPTIONS CMPLIB=libref.table | (libref.table-1...libref.table-n)
PROC FCMP OUTLIB=libref.table.package;
FUNCTION function-name(arguments <$>)<$><length>;
. . .
programming statements
. . .
RETURN(expression);
ENDSUB;
QUIT;
选项CMPLIB:指定存储函数包的表。是一个全局选项,设置此选项后,它将一直有效,直到取消、更改或退出SAS会话。
选项OUTLIB:指定存储编译函数的表和包。这是必须在PROC FCMP语句中指定的参数
FUNCTION语句:指定了函数名和函数参数,以及函数返回的是字符值还是数值
arguments:指定函数的一个或多个参数。通过在参数名称后面放置一个美元符号($)来指定字符参数。
<$>:指定函数返回一个字符值。如果未指定$,则函数返回一个数值。
举例:
proc fcmp outlib=certadv.functions.dev; /* 1 */
function ReverseName(lastfirst $) $ 40; /* 2 */
First=scan(lastfirst,2,','); /* 3 */
Last=scan(lastfirst,1,',');
return(catx(' ',First,Last)); /* 4 */
endsub; /* 5 */
run;
1、FCMP过程创建自定义函数。选项指定certadv.functions作为存储开发包的表。开发包是具有唯一名称的例程的集合。
2、FUNCTION语句将函数名指定为ReverseName。ReverseName是一个自定义函数,它有一个名为LastFirst的字符参数,并返回长度为40的字符值。如果没有指定返回值类型和长度,则默认为数值,长度为8。
3、函数体由数据步骤语法组成。赋值语句创建了两个新变量,First 和 Last,它们是使用SCAN函数创建的。
First 使用SCAN函数返回LastFirst变量中的第二个单词,First 返回LastFirst变量中的第一个单词。
4、RETURN语句指定了ReverseName的值。RETURN语句定义函数返回的值。它使用CATX函数将在函数定义中创建的第一个和最后一个变量值连接起来,变量值之间用一个空格分隔。
5、endsub语句,函数结束语句;
举例:
proc fcmp outlib=certadv.functions.dat;
function MyQuarter(month);
if month in(2,3,4) then myqtr=1;
else if month in(5,6,7) then myqtr=2;
else if month in (8,9,10) then myqtr=3;
else myqtr=4;
return(myqtr);
endsub;
run;
options cmplib=certadv.functions;
data work.dates;
do Dates='15JAN2019'd to '31DEC2019'd by 30;
MonNum=month(Dates);
FiscalQuarter=MyQuarter(MonNum);
output;
end;
run;
proc print data=work.dates;
format Dates mmddyy10.;
run;