SAS能自己编写函数么

sas常用函数和自动变量_中华文本库
第1页/共5页
SAS语言概述
SAS提供了一种完善的编程语言。类似于计算机的高级语言,SAS用户只需要熟悉其命令、语句及简单的语法规则就可以做数据管理和分析处理工作。因此,掌握SAS编程技术是学习SAS的关键环节。在SAS中,把大部分常用的复杂数据计算的算法作为标准过程调用,用户仅需要指出过程名及其必要的参数。这一特点使得SAS编程十分简单。
一、SAS程序
SAS程序是SAS语句的有序集合。
SAS程序可分为两部分:
1.数据步(DATA Step)
2.过程步(PROC Step)
在一份SAS程序中,通常有一个数据步和一个过程步.有时可能有多个数据步和多个过程步。
数据步是为过程步准备数据的且将准备好的数据放在数据集中,过程步是把指定数据集中的数据计算处理并输出结果。
二、SAS语句
SAS语句是以SAS关键词开头、后跟SAS名、特殊字符或操作符组成,并且以分号结尾。一个SAS语句规定了一种操作或为系统提供某些信息。
1.SAS关键字
关键字是系统已赋于确定意义的一个单词。在SAS语言里,除了赋值、 求和、注释等语句外,多数语句是以其关键字作为开头的。
如DATA、FORMA,PROC、INFILE等都是相应语句的关键字。
2.SAS名
在SAS语句中,可能出现的SAS名有变量名,数据集名,输出格式名,过程名,选择项名,数组名和语句标号名。还有SAS对文件的一种特殊称呼叫逻辑库名和文件逻辑名。SAS名是字母或下划线开头后跟宇母或数宇或下划线的字符串,字符个数不多于八个。 空格和特殊宇符(如$,@,#等)不许在SAS名中出现。另外,SAS保留了一些特殊的变量名并赋于特定的意义,这些变量都是以下划线开头和结尾,如N_表示数据步已执行过的次数。
三、语句描述记号
(1)关键字用英文书写,在写程序时,这些词必须严格以给出的拼写形式书写。
(2)[?]内的项是可选项。
(3),,表示有多个项目
第1页/共5页
寻找更多 ""本系列连载文章:
继续,今天开始注重变量操作。
SAS生成新变量
SAS支持基本的加减乘除,值得一提的是它的**代表指数,而不是^。
* Modify homegarden data set with a
INFILE 'c:\MyRawData\Garden.dat';
INPUT Name $ 1-7 Tomato Zucchini Peas G
Zone = 14;
Type = 'home';
Zucchini = Zucchini * 10;
Total = Tomato + Zucchini + Peas + G
PerTom = (Tomato / Total) * 100;
PROC PRINT DATA =
TITLE 'Home Gardening Survey';
12345678910111213
* Modify homegarden data set with assignment statements;DATA homegarden;INFILE 'c:\MyRawData\Garden.dat';INPUT Name $ 1-7 Tomato Zucchini Peas Grapes;Zone = 14;Type = 'home';Zucchini = Zucchini * 10;Total = Tomato + Zucchini + Peas + Grapes;PerTom = (Tomato / Total) * 100;RUN;PROC PRINT DATA = homegarden;TITLE 'Home Gardening Survey';RUN;
但是如果有缺失值的话,SAS的加法会生成缺失值而不是自动按0处理。为了避免这一点,应该调用sum()函数而不是直接写+。
SAS的函数调用很简单:
AvgScore = MEAN(Scr1, Scr2, Scr3, Scr4, Scr5);
DayEntered = DAY(Date);
Type = UPCASE(Type);
AvgScore = MEAN(Scr1, Scr2, Scr3, Scr4, Scr5);DayEntered = DAY(Date);Type = UPCASE(Type);
函数有文本类、数字类、日期类等等。
SAS文本类函数
ANYALNUM(arg,start):返回第一次出现任意数字或字母的位置,可选开始位置start。
ANYALPHA(arg,start):返回第一次出现任意字母的位置,可选开始位置start。
ANYDIGIT(arg,start):返回第一次出现任意数字的位置,可选开始位置start。
ANYSPACE(arg,start):返回第一次出现任意空白的位置,可选开始位置start。
CAT(arg-1,arg-2,...arg-n):连接字符串,留下头尾空白。
CATS(arg-1,arg-2,...arg-n):连接字符串,删除头尾空白。
CATX('separator-string', arg-1,arg-2,...arg-n):连接字符串,删除头尾空白并用指定标点连接。
COMPRESS(arg, 'char'):移除字符串中的空格和可选字符。
INDEX(arg, 'string') :返回指定字符在变量中的位置。
LEFT(arg) :字符串左对齐。
LENGTH(arg):返回字符串长度,不考虑尾部空格。
PROPCASE(arg) :首字母大写。
SUBSTR(arg,position,n):从字符串中提取指定开始位置指定长度字符。
TRANSLATE(source,to-1, from-1,...to-n,from-n):替换字符。
TRANWRD(source,from,to) :替换字符串。
TRIM(arg):删除尾部空白。
UPCASE(arg):替换成大写。
SAS数值函数
INT(arg):返回整数。
LOG(arg):自然对数。
LOG10(arg) :10为底对数。
MAX(arg-1,arg-2,...arg-n) :最大值
MEAN(arg-1,arg-2,...arg-n) :均值
MIN(arg-1,arg-2,...arg-n) :最小值
N(arg-1,arg-2,...arg-n) :非缺失值个数
NMISS(arg-1,arg-2,...arg-n) :缺失值个数。
ROUND(arg, round-off-unit) :保留几位小数。
SUM(arg-1,arg-2,...arg-n):求和。
SAS日期函数
DATEJUL(julian-date) :标准julian日期到SAS日期。
DAY(date):返回「日」。
MDY(month,day,year) :年月日到SAS日期。
MONTH(date) :返回「月」。
QTR(date):返回季度。
TODAY():今日
WEEKDAY(date):返回周几(周日为1)。
YEAR(date):返回「年」。
YRDIF(start-date,end- date,’ACTUAL’):返回相差年份。
SAS中判断语句
如果,则:
IF then: IF Model = 'Mustang' THEN Make = 'Ford';
IF then: IF Model = 'Mustang' THEN Make = 'Ford';
还可以执行多项命令,需要嵌套do;可以用and和or:
IF Year IF Model = 'Corvette' OR Model = 'Camaro' THEN Make = 'Chevy';
IF Model = 'Miata' THEN DO;
Make = 'Mazda';
Seats = 2;
IF Year IF Model = 'Corvette' OR Model = 'Camaro' THEN Make = 'Chevy';IF Model = 'Miata' THEN DO;Make = 'Mazda';Seats = 2;END;
还可以if else:
IF Cost = . THEN CostGroup = 'missing';
ELSE IF Cost ELSE IF Cost ELSE CostGroup = 'high';
IF Cost = . THEN CostGroup = 'missing';ELSE IF Cost ELSE IF Cost ELSE CostGroup = 'high';
用if可以选择数据子集:
IF Sex = 'f'; IF Sex = 'm' THEN DELETE;
IF Sex = 'f'; IF Sex = 'm' THEN DELETE;
SAS中保留和累加
比如要求累加值(等价于R里面的cumsum),需要:
* Using RETAIN and sum statements to find most
INFILE 'c:\MyRawData\Games.dat';
INPUT Month 1 Day 3-4 Team $ 6-25 Hits 27-28 Runs 30-31;
RETAIN MaxR
MaxRuns = MAX(MaxRuns, Runs);
RunsToDate + R
PROC PRINT DATA =
TITLE "Season's Record to Date";
1234567891011
* Using RETAIN and sum statements to find most runs and total runs;DATA gamestats;INFILE 'c:\MyRawData\Games.dat';INPUT Month 1 Day 3-4 Team $ 6-25 Hits 27-28 Runs 30-31;RETAIN MaxRuns;MaxRuns = MAX(MaxRuns, Runs);RunsToDate + Runs;RUN;PROC PRINT DATA = gamestats;TITLE "Season's Record to Date";RUN;
看一眼最终数据:
累加效果出来了~还有一栏是迄今最大值。这也是我觉得sas和R很不同的一点:sas是指针式操作,一行行往下读;而在R里面我们更多是向量或者矩阵式运算,感觉还是有所区别的...
SAS的数组操作
这个就更有点矩阵的味道了,不过还是偶尔感觉怪怪的...感觉数据整理和操纵方面,SAS还是比不上R灵活...
例子为替换为缺失值:
* Change all 9
INFILE 'c:\MyRawData\WBRK.dat';
INPUT City $ 1-15 Age domk wj hwow simbh kt a
ARRAY song (10) domk wj hwow simbh kt a
DO i = 1 TO 10;
IF song(i) = 9 THEN song(i) = .;
PROC PRINT DATA =
TITLE 'WBRK Song Survey';
123456789101112
* Change all 9s to missing values;DATA songs;INFILE 'c:\MyRawData\WBRK.dat';INPUT City $ 1-15 Age domk wj hwow simbh kt aomm libm tr filp ttr;ARRAY song (10) domk wj hwow simbh kt aomm libm tr filp ttr;DO i = 1 TO 10;IF song(i) = 9 THEN song(i) = .;END;RUN;PROC PRINT DATA = songs;TITLE 'WBRK Song Survey';RUN;
这样9就全部替换为缺失值了。把后面10列认为是一个数组,可以直接操作。
SAS还有若干变量名的快捷方式,暂不赘述了...
哪里有原始数据吗?哪里可以下载吗?
一点点声明
怕下次找不到门?直接google“落园”呗。
落园是我的非学术博客,只是为了娱乐大众。如果您对学术感兴趣,请移步我的或查看我的。
长篇连载系列苹果/安卓/wp
积分 1587, 距离下一级还需 638 积分
权限: 自定义头衔, 签名中使用图片, 设置帖子权限, 隐身
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡, 抢沙发, 提升卡下一级可获得
权限: 设置回复可见道具: 沉默卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
开心签到天数: 42 天连续签到: 4 天[LV.5]常住居民I
偶然情况下载help里面看到的一个过程步就到网上查了些资料,原来SAS也可以编写自己的function并调用,可以使复杂的函数瞬间变简单有木有!!!
proc fcmp outlib=function.funcsol.conversion
&&function change(lb);
&&kg=lb/2.2;
&&return (kg);
&&
&&复制代码恭喜大家,这样已经定义了一个属于你自己的函数了,名字叫做change,储存在function.funcsol.conversion 里面;需要注意的是储存的文件夹,也就是function.funcsol.conversion 一定是由三个目录组成的,WHY?
大家可以定义了这个函数之后自己去打开文件看一下,首先是主文件夹function(相当于work), 然后是funcsol(相当于数据集),
而conversion就相当于数据集里的索引了,我个人觉得SAS储存函数还是与储存数据是一样的,把编译了的函数储存在数据集里相当于,个人理解,希望大神指正,这样想便于理解嘛;
语法方面并不是很复杂,我就随便说一下;
相当于do循环有
function 有如果大家会VB的话,对sub肯定不陌生吧?打VBA天天打有木有~~~
剩下的就简单了,定义一个变量,计算,然后返回计算出来的值,函数结束;
接下来就和format一样,(或者是matlab里面的path),你要告诉SAS到哪里去找你定义的函数;
options cmplib=(function.funcsol);复制代码OK, 这样子SAS应该已经知道到哪里去找了;
接下来试一下效果:
set sashelp.class(keep=name age weight);
kilos=change(weight);
复制代码
这样我们就成功的调用了自己定义的函数;
最简单的例子就是这样了,接下来是进阶教程:
proc fcmp outlib=function.funcsol.
& & & & function lb2kgc(lb) $;
& & & & & & & & length kg $10;
& & & & & & & & kg = catt(put((lb/2.2),6.2),'kg');
& & & & & & & & return (kg);
& & & &
复制代码这个是什么?和前面不同的只有一点,就是return的不是一个数值型变量而是一个字符型变量;
SO,和定义变量一样,加一个 $ 就好;
其他的语法都是一样的,只是一个catt的连接函数而已;
options cmplib=(function.funcsol);
& & & & set sashelp.class(keep=name age weight);
& & & & kilos=change(weight);
& & & & kg_c=lb2kgc(weight);
复制代码一样的,试一下;
proc fcmp outlib=function.funcsol.
& & & & function bmi(lb,ht);
& & & & & & & & return((lb*703)/(ht*ht));
& & & &
& & & &
options cmplib=(function.funcsol);
set sashelp.class(keep=name age weight height);
bmi=bmi(weight,height);
复制代码OK,两个自变量,right?
接下来两个例子我觉得写得爆赞,可以一窥函数定义的妙处所在;
proc fcmp outlib=function.funcsol.
& & & & subroutine biomassindex(w,h,b);
& & & & & & & &
& & & & & & & & b= ((w*703)/(h*h));
& & & &
& & & &
options cmplib=(function.funcsol);
& & & & set sashelp.class(keep=name age weight height);
& & & & bmindex=.;
& & & & call biomassindex(weight,height,bmindex);
复制代码几个重要一点的point;
1、 subroutine 这里可以把自变量和return值放在一起;然后通过 outargs来确定输出值是哪一个;看看例子大家一定会明白吧,所以用一个 call function 就可以完成对输出值的赋值;
proc fcmp outlib=function.funcsol.
& & & & function fromto(code $,v);
& & & & & & & & if upcase(code)='LB2KG' then r=V/2.2;
& & & & & & & & else if upcase(code)='KG2LB' then r=v*2.2;
& & & & & & & & else r=.;
& & & & & & & & return (r);
& & & &
& & & &
option cmplib=(function.funcsol);
& & & & set sashelp.class(keep=name age weight);
& & & & kilos=fromto('lb2kg',weight);
& & & & pounds=fromto('kg2lb',kilos);
& & & &复制代码没有错,函数里面是可以用逻辑语句的,想怎么编就怎么编,接下来大家可能会想怎么样才能够做的更复杂,接下来的例子就是在函数里引入macro, macro本来就是为了使语句更加简化而生的,碰上个一样目的的函数过程步,不能再简化了有木有~~
%macro printit();
%put &lib &
& & & & %let lib = %sysfunc(dequote(&lib));
& & & & %let dsn = %sysfunc(dequote(&dsn));
& & & & %let num = %sysfunc(dequote(&num));
& & & & %if &num = %then %let num=
& & & & title2 &&lib..&dsn&;
& & & & title3 &first &num observations&;
& & & & proc print data=&lib..&dsn(obs=&num);
& & & & & & & &
%
proc fcmp outlib=function.funcsol.
& & & & subroutine printN(lib $, dsn $, num);
& & & & & & & & rc=run_macro('printit',lib,dsn,num);
& & & &
& & & &复制代码这里有一个错误使用macro的误区,我来说说我的看法吧,如果你在fcmp里面使用%macro来调用宏的话,就会存在一个编译错误的问题,具体的机制我也不甚清楚,但是可以肯定的是,这样子的宏是没法编译的,因为编译函数我觉得可能在编译宏之前,那样函数的编译就会出错;
所以使用run_macro ('printit',...);
来输入宏和宏变量;
剩下两个例子我个人觉得有点鸡肋,不过用处还是有的,如果你想定义非常复杂的format的话,这个还是有用的吧;
& & & & value pounds2kg
& & & & & & & & other=[change()];
& & & &
options cmplib=(function.funcsol);
title2 'Weight in Kg';
proc print data=sashelp.
& & & &
& & & & format weight pounds2kg.;
& & & &复制代码大家看到了,就是起到了一个定义format里面格式的作用,把所有的格式都定义为change里面的return值,但是数据集里的值是不变的;
当然,fcmp是可以输出多个值得,用subroutine就好了不是么?
proc fcmp outlib=function.funcsol.
& & & & subroutine metric_hwbmi(h,w,mh,mw,bmi);
& & & & & & & & outargs mh,mw,
& & & & & & & & mh = h*.0254;
& & & & & & & & mw = w*.4536;
& & & & & & & & bmi = mw/(mh*mh);
& & & &
& & & &
options cmplib = (function.funcsol);
& & & & set sashelp.class(keep=name age height weight);
& & & & heightmeters=.;
& & & & weightkilos=.;
& & & & bmi=.;
& & & & call metric_hwbmi(height,weight,heightmeters,weightkilos,bmi);
& & & &复制代码
%sysfunc 和 %call,能调用普通函数的工具当然也能调用我们定义的函数;
options cmplib=(function.funcsol);
%let ht = 69;
%let wt = 112.5;
%let bmi = %sysfunc(bmi(&wt,&ht));
%put &复制代码
最后一点,定义的函数怎么去除,easy, delete 掉就好(deletefunc)
proc fcmp outlib=function.funcsol.
& & & & deletefunc lb2
& & & & del
& & & &复制代码
定义了的函数可以一直调用而且也可以给别人使用;
但是根据我自己的试验,这个因为是储存成字符,英文版和中文版定义的函数是不能通用的哦~~~~希望大家能把自己的code写的越来越简单,越来越漂亮~~~~
翻译自: ——Arthur:L.Carpenter(希望我理解的木有错)
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
总评分:&经验 + 20&
学术水平 + 1&
热心指数 + 1&
本帖被以下文库推荐
& |主题: 246, 订阅: 43
我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
第一次知道还有这个功能,谢谢分享
哇,这个好
好东西,感谢分享~~~
正需要,非常感谢
你好~请问索引要事先建立好吗?如果别人要用我的函数,那逻辑库数据集索引是不是也要改成别人SAS里的?重新启动SAS要重新定义函数吗?
多谢指点!
初级热心勋章
初级热心勋章
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师SAS编程基础_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
SAS编程基础
上传于||暂无简介
大小:291.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢后使用快捷导航没有帐号?
查看: 6116|回复: 22
【问】如何表示指数函数
论坛徽章:1
请问在SAS中如何表示指数函数呢?
比如说2的3次方?
再者,在哪里可以方便找到“关于在SAS中使用数学函数”的这些内容呢?
金牌会员, 积分 2246, 距离下一级还需 754 积分
论坛徽章:13
建议你直接试一下^符号
我一般会在相关pdf里搜索关键字来得到信息
SAS中的数学函数 这个你可以就在dataguru上搜索一下 记得有不少人分享过
论坛徽章:1
yao_561 发表于
建议你直接试一下^符号
我一般会在相关pdf里搜索关键字来得到信息
试过这个“ ^ ”,但是好像SAS认不出它。。。
金牌会员, 积分 2246, 距离下一级还需 754 积分
论坛徽章:13
zhangmaosheng 发表于
试过这个“ ^ ”,但是好像SAS认不出它。。。
金牌会员, 积分 2246, 距离下一级还需 754 积分
论坛徽章:13
zhangmaosheng 发表于
试过这个“ ^ ”,但是好像SAS认不出它。。。
金牌会员, 积分 1227, 距离下一级还需 1773 积分
论坛徽章:1
《SAS统计分析与数据挖掘》上有,老师推荐过的,放假后才开始看那本书,觉得那本书虽然比较枯燥 但是有很多函数总结、语句总结都很好!
论坛徽章:1
RAN 发表于
《SAS统计分析与数据挖掘》上有,老师推荐过的,放假后才开始看那本书,觉得那本书虽然比较枯燥 但是有很多 ...
朱世武老师写的那本吗?
论坛徽章:1
RAN 发表于
《SAS统计分析与数据挖掘》上有,老师推荐过的,放假后才开始看那本书,觉得那本书虽然比较枯燥 但是有很多 ...
1.png (6.91 KB)
17:27 上传
感触良多啊,哈哈~~
金牌会员, 积分 2007, 距离下一级还需 993 积分
论坛徽章:6
不是上网一搜就有了咩? EXP(x) 指数函数.
论坛徽章:1
wendychen 发表于
不是上网一搜就有了咩? EXP(x) 指数函数.
如果底数不是e呢?

我要回帖

更多关于 sas substr函数 的文章

 

随机推荐