【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)
今天开始注重变量操作。
SAS生成新变量
SAS支持基本的加减乘除,值得一提的是它的**代表指数,而不是^。* Modify homegarden data set with assignment statements; DATA homegarden; INFILE 'c:MyRawDataGarden.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;
* Modify homegarden data set with assignment statements;
DATA homegarden;
INFILE 'c:MyRawDataGarden.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; END;
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 runs and total runs; DATA gamestats; INFILE 'c:MyRawDataGames.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;
* Using RETAIN and sum statements to find most runs and total runs;
DATA gamestats;
INFILE 'c:MyRawDataGames.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 9s to missing values; DATA songs; INFILE 'c:MyRawDataWBRK.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;
* Change all 9s to missing values;
DATA songs;
INFILE 'c:MyRawDataWBRK.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还有若干变量名的快捷方式,暂不赘述了...
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解析 HashMap源码值概括
- 解析 HashMap 源码之基本操作
- Docker手册
- 小知识:TFA收集日志报错空间不足
- Java SPI 居然这么多知名框架在用
- Ceph 入门到实战之 RBD 块存储接口
- 聊聊 Python 面试最常被问到的几种设计模式(下)
- 带你用 Python 实现自动化群控(入门篇)
- 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)
- 在kali linux中你应该知道的信息收集姿势(一)
- 【拓展】谈谈字符编码:Unicode编码与emoji表情编码
- TCP/IP 应用层协议解释
- Cisco Packet Tracer服务器模拟搭建
- Python3调用Google翻译
- 打造最强移动测试平台