SAS入门操作

SAS入门操作SAS基础知识

大家好,欢迎来到IT知识分享网。SAS入门操作"

##1.1 新建数据集
libname chap1 'E:\sasdata\chap1';
在E:\sasdata\chap1中新建一个逻辑库,E:\sasdata\chap1必须真实存在,其中保存着我们要调用的文件,同时路径名字尽量是拼音或者英文。chap1中的数据只有是SAS data set时才可以被直接调用
data chap1.example1_1;新建永久sas数据集chap1.example1 前一部分为库名,后一部分为数据集名
data work.example1_1; 或者work.example1_1 临时数据库保存在work下
data 数据集名;
input 变量名;
card; 输入数据

run;
proc print data=数据集名; #将数据集显示在output窗口上
run;

eg:建立永久数据集

libname classc "C:\Users\Administrator\Desktop\7\SAS-1024"; #创建逻辑库
filename class "C:\Users\Administrator\Desktop\7\SAS-1024\class.csv"; #指定要调用的文件(同时为该文件的路径命名class,方便后面调用)
data classc.class1;#在classc逻辑库中创建数据集class1(库名+数据集名)
     infile class#导入要调用的文件
	 dsd;
    input name$ id$ test1 test2 gender$;
run;

一个逻辑库对应两个物理位置
libname classc ("C:\Desktop\7\SAS-1024" "C:\Desktop\7\SAS-1025");
逻辑库的查看与取消
1.在log窗口查看逻辑库连接 libname 库名 list;
2.在log窗口显示全部已设定的库的信息 libname ALL list;
3.取消已经指定的库 libname 库名 clear;

SAS数据集存储在SAS的逻辑库(library)文件集中,逻辑库是一个连接,将磁盘中存储的文件和SAS系统联系起来。逻辑库命名遵循命名规则
1.1SAS标识符必须由英文字母,数字,下画线组成
1.2第一个字符必须是英文或者下划线
1.3标识符中字母不区分大小写
1.4标识符长度不宜过长
1.5逻辑库命名不超过8个字符,数据集,变量命名不超过32个长度

##1.2从外部导入数据
###1.2.1 import

###1.2.2 data step输入文件
infile “外部文件的所在位置及名称”<选项>;#指定一个包含原始数据的外部文件,出现在input之前
input 变量名1 变量名2…; #按列输入;格式化输入;列举输入
按列自由输入

data bank;
infile "E:\SAS\SAS-Yan\lec3-170927\bank1.txt";
input subj $1-3
           dob$4-13
          gender$14
          balance$15-21
          year 10-13
;
run;
proc print data=bank;
run;

格式输入
input <列指针控制> 变量名 输入格式;

data bank;
infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt;
input @1 subj $3.
           @4 dob mmddyy10.
           @14 gender$1.
           @15 balance7.
;
run;

SAS有输入和输出格式,输入格式在input中使用,输出格式在format中使用
用于输入有特殊格式的数据:日期,带小数的数字,含空格的字符串
常用:
W. 宽度为W位的标准数字(无小数)
W.D 含小数的标准数字,总长为W位(小数点,负号各占一位)
$W. 长度为W的标准字符串
COMMAW.D 长度为W的数字,每三个数字用逗号隔开,且逗号占一位
$CHARW 宽度为W且含有空格的字符串

format中指定输出格式

data bank;
infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt;
input @1 subj $3.
           @4 dob mmddyy10.
           @14 gender$1.
           @15 balance7.
;
format dob data9. balance dollar11.2;
run;
proc print data=bank;
run;

列举模式
这种模式较为简便,但是变量名顺序必须和数据中相同,无法更改

data bank2;
infile "E:\SAS\SAS-Yan\lec3-170927\bank2.txt;
length subj dob $10. #列举模式中每个变量默认最大读入长度为8,此语句可以修改最大长度
input subj $
           dob $
           gender$
          balance
;
run;
title="list of bank2";
proc print data=bank;
run;

##1.3读入csv文件

data contact;
     infile "E:\SAS\SAS-Yan\contact.csv"
	 dsd;#将多个相连的分隔符由空格改为逗号,csv必加
	 input name$ id$ test1 test2 gender$;
run;
title="contact.csv";
proc print ;
run;
data contact;
     infile "E:\SAS\SAS-Yan\contact.csv"
          dlm=":" #标明分隔符,等号后内容根据数据中的具体分隔符来定
	 dsd;
	 input name$ id$ test1 test2 gender$;
run;
title="contact.csv";
proc print ;
run;

查找dlm其他用法

非标准格式读入
1.一行多观测,空格作为间隔 input语句后中加入@@ 行保持符
2.多行一观测,空格作为间隔 /表示下一行
3.混合
4.读取特定行

data bank;
infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt" firstobs=3 obs=6;
input @1 subj $3.
           @4 dob mmddyy10.
           @14 gender$1.
           @15 balance7.
;
format dob data9. balance dollar11.2;
run;
proc print data=bank;
run;

##1.4基于列的操作运算
针对变量的操作:
-生成新的变量
–依据现有变量
–不依据现有变量
-删除已有变量
-修改已有变量
-给现有变量命名
-set keep drop rename 常用函数 复合判断语句 do-end语句块

fileneme myfile "E:\data\chap1\garden0.dat";
data garden;
infile myfile;
input name$ tomato$ zucchini  peas  grapes;
zone=14; *建立新变量并直接赋值
type="home";
zucchini=zucchini*10;*改变已有变量
total=tomato+zucchini+peas+grapes;
periom=tomato/total;*利用原有变量计算新变量
run;

data garden1;
set garden;
      keep name total; *保留变量
run;

data garden2;
set garden;
     drop zone type; *删除变量
run;

data garden3(replace=yes);新建立的garden3覆盖了garden2
set garden2;
drop name
    rename total=all;  *重命名变量
run;

data garden4(replace=yes);
set garden;
logtomato=log(tomato); *添加变量
firstchar=substr(name,1,2); *添加变量,提取name前两个字母
if grapes<50 then groupgrapes="low";*添加变量groupgrapes
else groupgrapes="high";
run;

data garden4(replace=yes);
set garden;
logtomato=log(tomato); *添加变量
firstchar=substr(name,1,2); *添加变量,提取name前两个字母
if grapes<50 then groupgrapes="low";
else  if grapes>=50 and grapes<100 then groupgrapes="med";
else groupgrapes="high";
run;

data garden4(replace=yes);
set garden;
logtomato=log(tomato); *添加变量
firstchar=substr(name,1,2); *添加变量,提取name前两个字母
if grapes<50 then                *do--end 语句块,多变量嵌套
do;
    groupgrapes="low";
    zone=16;
else 
do;
    groupgrapes="high";
    zone=12;
end;
run;

##1.5变量的运算
###逻辑运算
EQ NE GT LT GE LE IN
###数值或文本型变量:
取整(INT)
对数(LOG)
极值(MIN,MAX)
均值(MEAN)
求和(SUM)
计数(N,NMISS)
四舍五入(ROUND)
###日期型变量
-year(date):
-month(date)
-day(date)
-weekday(date)
mdy(m,d,yr):生成ye年m月d日的sas日期值
###字符型变量
lowcase(s),upcase(s):改变大小写
substr(s,p,n):从字符串s中第p个开始抽取n个
repeat(s,n):将s重复n次
index(s,s1):查找s1在s中的位置
length(s):返回s的长度
tranwrd(s,s1,s2):从字符串s中把所有字符s1替换成s2后的结果

##1.6基于行的运算操作
-排序 sort+by
-提取部分观测
–指定条件提取 if where
–随机提取 surveyselect
-添加新观测 append+base,data
-删除已有观测:delete语句
-修改已有观测

*排序
filename myfile "文件夹路径";
data marine;
infile myfile(lengths.dat);
input name$ family$ length@@; 
run;
proc sort data=marine out=seasort nodupkey; *输出为数据集seasort,不加out时覆盖原有数据集;nodupkey删除冗余观测
by family descending length; *先按family升序排列,再按length降序排列
run;
proc print data=seasort;
title print data=seasort;;
run;

*提取指定条件的观测
data seasort_whalel;
set seasort;
if Family="whale";
run;
*or
data seasort_whalel;
set seasort;
where Family="whale";
run;

*where与by
proc sort data=marine out=seasort_whale nodupkey; 
where Family="whale";
by  descending length; *先按family升序排列,再按length降序排列
run;
proc print data=seasort_whale;
title "whales only (sorted);
run;

*随机抽取
proc surveyselect data=marine method=srs n=5 out=sampled_marine;
*从marine中抽取5个数形成sampled_marine,其后可以加seed=1以多次抽取相同的数
run;
proc print data=sampled_marine;
run;

*添加新观测(像原有数据集中添加一条或者多条记录)
data temp(replace=yes);
input name$ family$ length;
datalines;
aaa  shark 60
;
run;
proc append base=marine data=temp;
run;
proc print data=marine;

*删除指定的观测
data marine;
set marine;;
if family="" then delete; *删除缺失值
run;

data marine;
set marine;
if _n_=2 or _n_=3 then delete; *删除第2和第3个观测??
run;

*重编码
data marine;
set marine;
if family="" then family="unknown";
run;

*转置(仅限于数值变量)
PROC TRANSPOSE <DATA=输入数据集 OUT=转置数据集><选项列表>
VAR 变量列表
ID 变量
COPY 变量列表
RUN;

libname chap1 "";
proc transpose data=chap1.A out=chap1.TA name=course;
/将数据集cha1.A转置成chap1.TA, 变量名name改为course*/
var statistics chinese;          /*指定转置变量*/
id name;                        
run;

##1.7多数据集操作
–复制数据集 data +set
–拆分数据集 data+output
–合并数据集

data marine0;
 set marine;
run;

*拆分数据集
data whale shark(replace=yes);
set marine0;
if family="whale" then output whale;
else if family="shark" then output=shark;
run;

*数据纵向连接
set 数据集名称1 数据集名称2...  数据集名称n;
libname chap1 "";
data chap1.AB;           
set chap1.A  chap1.B;   /*合并数据集chap1.A和chap1.B*/
run;

data chap1.AC;
set chap1.A chap1.C; /*合并数据集chap1.A和chap1.C*/
run;

*数据集横向合并
libname chap1 "";
proc sort data=chap1.C out=chap1.C;
by name;
run;
proc sort data=chap1.D out=chap1.D;
by name;
run;
/*以上对数据集chap1.C和chap1.D按照关键变量name升序排列/
data chap1.CD;
merge chap1.C  chap1.D;  /*横向合并数据集chap1.C和chap1.D*/
by name;                   /*设置关键变量为id*/
run;

##无数据集 _NULL_
不产生数据集,仅在log页面下显示输出
data _NULL_;
x=exp(5);
y=log(10);
put x= y=;
run;

data _NULL_;
x=0.1;
y=1-(1-x)**50;
y2=round(y,0.01);
y4=round(y,0.0001);
put y2= y4=;
run;

###1.8循环语句
1.DO循环
格式:
DO 计数变量=起始值 TO 结束值 BY 步长;
循环体…;
END;
在循环体中可以用LEAVE语句跳出循环,使用COUNTRY语句结束本轮循环,调整计数变量进入下一轮循环。

data chap2.example2_1;
do x=5 to 30 by 5;           /*设置x的起始值为5,终止值为30,步长为5*/
y=log(x);                  /*取y值为x的自然对数*/
if y>3 then leave;           /*若y的值大于3结束循环*/
output;
format y 8.5;           /*定义y的输出形式为总长度为8位,小数部分占5位*/
end;                  /*结束循环·*/

/*·方法二:DO循环结合CONTINUE语句*/
data chap2.example2_1;
do x=5 to 30 by 5;           /*设置x的起始值为5,终止值为30,步长为5*/
y=log(x);                  /*取y值为x的自然对数*/
if y>3 then continue;         /*若y的值大于3就跳出循环*/
output;
format y 8.5;              /*定义y的输出形式为总长度为8位,小数部分占5位*/
end;                     /*结束循环*/

2.DO WHILE循环
格式:
DO WHILE 循环的语法结构;
DO WHILE(循环继续条件);
循环体语句;
END;
开始执行时,会先判断循环条件表达式的逻辑结果是否为真,若为真,则继续执行循环体语句,若为假则循环结束,循环语句每执行一次,检验循环条件一次

data chap2.example2_2;
y=100;     /*取y的初始值为100*/
do x=2 to 10 by 2 while (y<3000);   /* 当y的值小于3000时,继续循环*/
y=y*x;   /*y的值为前一次循环结束后y的值和当次循环x值的乘积*/
output; 
end;
run;

3.DO UNTIL 循环
格式:
DO UNTIL (循环退去条件);
循环体语句…;
END;
语句开始执行,首循环体每执行一次都要判断是否满足循环退出条件,若循环退出条件表达式的逻辑结果为真,则退出循环,否则重复执行循环体语句

data chap2.example2_2;
y=100;     /*取y的初始值为100*/
do x=2 to 10 by 2 until (y>=3000);   /* 当y的值大于等于3000时,退出循环*/
y=y*x;   /*y的值为前一次循环结束后y的值和当次循环x值的乘积*/
output; 
end;
run;

上述三种循环都在DATA步完成,DO循环不设限定条件,DO WHILE和DO UNTIL循环都设置了循环条件;DO WHILE 的条件在循环体开头,DO UNTIL的条件在循环体结束

##1.9条件分支结构 if-else in select

*if-else
data conditional;
length gender $1 quiz $2;
input age gender midterm quiz finalexam;
if missing(age) then agegroup=.;  *缺失值
else if age lt 20 then agegeoup=1;
else if age lt 40 then agegroup=2;
else if age lt 60 then agegroup=3;
else if age ge 60 then agegroup=4;
datalines;

*写if语句时,一般将最容易出现的语句写在前面

if quiz="A+" or quiz="A" or quiz="B+" or quiz="B" then quizrange=1;
else if....
改为in
if quiz in ("A+" "A" "B+" "B") then quizrange=1

*用select结构进行逻辑判断代替一系列的if 和else if

select(agegroup);
when(1) limit=110;
when(2)limit=120;
when(3)limit=130;
otherwise;
end;

*select-expresion 和when-expresion进行比较如果成功,执行其后语句并直接跳到select结构末尾。如果没有一次比较成功,执行otherwise后的语句,otherwise后的语句也可以为空。when语句可以包含多个比较值,例如“when(3,5) limit=130;”表示agegroup是3或5,则limit等于130.
*select后还可以是空语句,此时,每一条when都将通过比较决定与否

data conditional;
length gender$1 quiz$2;
input age gender midterm quiz finalexam;
select;
when (missing(age)) agegroup=.";
when (age lt 20) agegroup=1;
when (age lt 40) agegroup=2;
when (age lt 60)agrgroup=3:
when (age ge 60)agegroup=4;
otherwise;
end;
datalines;
......

##1.10 ODS输出系统
ODS能让用户选择以各种美观的格式报告和显示分析结果,使用DOCUMENT过程,可以生成多个ODS输出控制文档内容的去留及显示格式而不必反复运行过程和查询。
主要支持格式:
RTF 多文本文件格式
OUTPUT SAS数据集格式
LISTING
HTML
PRINTET
ODS输出RTF文档格式:

ODS LISTING CLOSE; /用户不创建列表输出/
ODS RTF FILE="文件名.RTF"
...;
ODS RTF CLOSE;
ODS CLOSE;

SAS实例

ODS listing close;                             /*关闭SAS列表输出*/
ODS rtf file=' E:\proc\chap2\example2_5.rtf';    /*定义输出文档名为example2_5以及存储路径*/
proc print data=chap2.example2_4;
run;
ODS rtf close;                     /*结束将SAS运算结果以文本文档形式输出的过程*/
ODS listing;                     /*打开SAS列表输出*/

ODS输出RTF文档格式,将rtf改为pdf;ods输出csv格式文档,将rtf改为csv

##1.11export输出

Proc EXPORT
Data=数据集
OUTFILR=为导出的数据命名
DBMS=数据类型标识符
;
Run;

proc export data=sashelp.prdsale
outfile='C:\Users\SJ\Desktop\prdsale.csv'
dbms=csv replace;
delimiter=',';    #指定分隔符
putnames=no;   #是否将SAS变量名作为列名写入文件的第一行,默认为Yes
run;

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10153.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信