文章目录
- 简介
- 字符变量处理
- 字符处理函数
- 案例
- 数值变量处理
- 取整函数
- 描述性统计函数
- 变量类型转换
- 字符型转换为数值型
- 数值型转换为字符型
- 案例
简介
函数类型
数组函数 / 字符函数 / 日期时间函数 / 描述统计函数 / 金融函数 / 数学函数
概率函数 / 随机数函数 / 三角函数 / 特殊函数 / 州和Zip码换算函数
SAS 变量列表
SAS变量列表是对要引用的一组变量的简写形式
在第一个变量名称前需使用OF
关键字
四种形式:
- 序号区间
Total = sum(of Year1-Year4);
- 名称区间
Total = sum(of Year2--Year4);
- 名称前缀
Total = sum(of Year:);
- 特殊SAS名称列表
字符变量处理
字符处理函数
- SUBSTR 函数 (右侧)
在赋值语句右侧的SUBSTR 函数可用于提取字符。NewVar=SUBSTR(string,start<,length>);
- PROPCASE 函数
PROPCASE函数将变量中的所有字符转换为合适的格式。
(第一个字符为大写,其他的字符为小写 )NewVar = PROPCASE(argument <,delimiter(s)>);
- delimiter(s)是用于分隔的字符。若缺失,默认的分隔符包括空格, /, - ,制表符等
- SCAN 函数
用于返回一个字符串中的第 n个词。NewVar = SCAN(string,n<,charlist>);
- 当字符串中的字符值个数少于指定的n 时,返回缺失值。
- 当n 为负数时,SCAN函数将从字符串的末尾开始选择字符。
- 创建得到的之前未用LENGTH 语句对进行定义的变量值的长度为200 字节。
- 第一个字符值前的分隔符无效。
- 任何的字符或字符组合也可作为分隔符。
- 两个或更多的连续的分隔符被视为一个分隔符
- CATX 函数
CATX 可对字符串进行连接。NewVar = CATX(separator, string-1, … ,string-n)
- separator,是一个字符串,其将会被插入到各连接的参数中。
- 若之前未用LENGTH语句对NewVar进行定义,则创建的NewVar的长度将为200字节。
- 连接运算符
!!
或||
- FIND 函数
FIND函数在目标字符串中搜寻指定的子字符串。
若要搜寻的子字符串被找到,返回其第一次出现的位置。如果未找到,返回 0值Position = FIND(string,substring <,modifiers,startpos> );
- Modifiers 可以是
I 表示不区分大小写的搜寻。
T 表示忽略string和substring中的拖尾空格。- startpos 指定从字符串的何处开始搜寻子字符串。
- SUBSTR 函数(左侧)
(在赋值语句左侧)用于对字符变量进行字符替换。SUBSTR(string,start<,length>)=value;
- length指定string中被替换字符的长度。若缺失,则从 start 位置到string 最后的所有字符全部进行替换。
- Length的值不能大于剩余字符的长度(包括尾部空格)
- TRANWRD函数
用TRANWRD函数可对字符串中指定的字符值或字符串进行替换或清除。NewVar = TRANWRD(source,target,replacement);
- TRANWRD函数不会移除target或者replacement的尾部空格。
- 若未预先定义长度,则新变量NewVar 的长度将为200字节。
若查找的源字符中没有目标字符,则不会发生替换
- COMPRESS 函数
可将源字符中的指定字符除去。
(若不指定要除去的字符,COMPRESS 函数会将源字符
中的空格全部删去)NewVar = COMPRESS(source<,chars>);
- 其他字符处理函数
案例
- CASE1
data charities;
length ID $ 5;
set orion.biz_list;
if substr(Acct_Code,length(Acct_Code),1)='2';
ID=substr(Acct_Code,1,length(Acct_Code)-1);
Name=propcase(Name)
run;
- CASE2
STEP1: 将姓和名分开。
STEP2: 将称谓,名和姓连接。
data labels;
set orion.contacts;
length FMName LName $ 15;
FMName = scan(Name,2,',');
LName = scan(Name,1,',');
FullName = catx(' ',Title,FMName,LName);
run;
proc print data=labels noobs;
var ID FullName Title;
run;
- CASE3:
STEP1: 找到Product中含有Mittens 的观测。将找出的观测中 Product_ID 中的字符替换掉。
STEP2: 将Luci 修正为Lucky
STEP3: 用COMPRESS 和PROPCASE 函数来除去Product_ID 中的空格,并确保 Product的正确格式。
data correct;
set orion.clean_up;
if find(Product,'Mittens','I') > 0 then do;
substr(Product_ID,9,1) = '5';
Product=tranwrd(Product,'Luci ','Lucky ');
end;
Product_ID = compress(Product_ID);
Product = propcase(Product);
run;
proc print data=correct noobs;
run;
数值变量处理
取整函数
ROUND:近似取整 NewVar = ROUND(argument<,round-off-unit(最小近似单位)>);
CEIL:向上取整 NewVar = CEIL(argument);
FLOOR: 向下取整 NewVar = FLOOR(argument);
INT:返回整数部分数值 NewVar = INT(argument);
描述性统计函数
- 所有参数均需为数值型。
- 参数可以是以OF开头的变量列表。
- SUM, MEAN, MAX, 和MIN函数会忽略参数中的缺失值
变量类型转换
字符型转换为数值型
- 自动转换
在数值型环境下,SAS 会自动将字符型变量转换为数值型变量
→ 适用情境:
- 赋值给一个数值型变量
- 使用了算术运算符
- 和数值进行逻辑比较
- 用于一个需要数值型参数的函数
需使用w. 输入格式;对不符合标准数值格式的字符以数值缺失值表示【含有逗号的变量值(1,742.64
),不能使用w. 输入格式自动转换,因为被赋为缺失值;要进行强制转换】
- INPUT 函数强制转换
INPUT函数以一个指定的输入格式对原数据进行读取并返回相应的值(不会有转换信息输出至日志窗口)NumVar = INPUT(source,informat);
data Input_Quiz;
SharePrice = "$130.25";
MyShares = 125;
TotalValue = input(SharePrice,comma7.)*MyShares;
run;
- 将字符型变量转换为另一数据类型
一个变量只能是字符型或数值型二者之一。当变量的数据类型被确定后就不能改变。GrossPay=input(GrossPay,comma6.);
错误!GrossPay原本是字符型,不能被赋值为数值型
正确方法:
STEP1: 用RENAME=
对想要转换的变量进行重命名。
STEP2: 使用INPUT
函数于赋值语句中,创建同名的新变量。
STEP3: 在DATA语句中使用DROP= 选项将原变量从输出 数据集中删去。
(该程序的编译过程中, PDV 里创建了一个名为 GrossPay 的新的数值型变量。)
data hrdata(drop=CharGross);
set orion.convert(rename=(GrossPay=CharGross));
GrossPay=input(CharGross,comma6.);
run;
数值型转换为字符型
- 自动转换
在字符环境下,SAS会自动将数值型数据转换为字符类型。
- 适用情境:
→ 赋值给一个字符型变量
→ 用于连接算符
→ 用于使用字符型参数的函数 - 注意:
→ 自动转换使用BEST12. 输出格式
→ 将字符型数据进行右对齐
(要进行修正,使用PUT函数将数值型强制转换为字符型)
- PUT 函数强制转换
PUT 函数用指定的输出格式将数据输出; 返回原数据应用输出格式后相应的值。CharVar = PUT(source,format);
- 常用输出格式
W.d 写入数值型数值作为字符型数值
Zw. 写入数值型数值,在前端插入0
- CAT 函数和数值转换
CAT族函数按BEST12. BEST12. 格式将数值型参数转换为一个字符串,并删去其前置的空格。日志中不出现相应的提示信息。
Phone=cat('(',Code,') ',Mobile);
Phone='(' !! put(Code,3.) !! ') ' !! Mobile;
案例
data hrdata;
keep EmpID GrossPay Bonus Phone HireDate;
set orion.convert(rename=(GrossPay=
CharGross));
EmpID = input(ID,5.)+11000;
GrossPay = input(CharGross,comma6.);
Bonus = GrossPay*.10;
HireDate = input(Hired,mmddyy10.);
Phone=cat('(',Code,') ',Mobile);
run;
proc print data=hrdata noobs;
var EmpID GrossPay Bonus Phone HireDate;
format HireDate mmddyy10.;
run;
在PROC CONTENTS语句中使用 VARNUM 选项,可将数据集中的所有变量按其逻辑顺序输出。