设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1453|回复: 0

SAS入门操作

[复制链接]

23

主题

175

金钱

287

积分

入门用户

发表于 2019-8-15 14:29:00 | 显示全部楼层 |阅读模式

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:建立永久数据集
  1. libname classc "C:\Users\Administrator\Desktop\7\SAS-1024"; #创建逻辑库
  2. filename class "C:\Users\Administrator\Desktop\7\SAS-1024\class.csv"; #指定要调用的文件(同时为该文件的路径命名class,方便后面调用)
  3. data classc.class1;#在classc逻辑库中创建数据集class1(库名+数据集名)
  4.      infile class#导入要调用的文件
  5.      dsd;
  6.     input name$ id$ test1 test2 gender$;
  7. run;
复制代码


一个逻辑库对应两个物理位置
  1. 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…; #按列输入;格式化输入;列举输入
按列自由输入
  1. data bank;
  2. infile "E:\SAS\SAS-Yan\lec3-170927\bank1.txt";
  3. input subj $1-3
  4.            dob$4-13
  5.           gender$14
  6.           balance$15-21
  7.           year 10-13
  8. ;
  9. run;
  10. proc print data=bank;
  11. run;
复制代码


格式输入
input <列指针控制> 变量名 输入格式;
  1. data bank;
  2. infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt;
  3. input @1 subj $3.
  4.            @4 dob mmddyy10.
  5.            @14 gender$1.
  6.            @15 balance7.
  7. ;
  8. run;
复制代码


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

format中指定输出格式
  1. data bank;
  2. infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt;
  3. input @1 subj $3.
  4.            @4 dob mmddyy10.
  5.            @14 gender$1.
  6.            @15 balance7.
  7. ;
  8. format dob data9. balance dollar11.2;
  9. run;
  10. proc print data=bank;
  11. run;
复制代码


列举模式
这种模式较为简便,但是变量名顺序必须和数据中相同,无法更改
  1. data bank2;
  2. infile "E:\SAS\SAS-Yan\lec3-170927\bank2.txt;
  3. length subj dob $10. #列举模式中每个变量默认最大读入长度为8,此语句可以修改最大长度
  4. input subj $
  5.            dob $
  6.            gender$
  7.           balance
  8. ;
  9. run;
  10. title="list of bank2";
  11. proc print data=bank;
  12. run;
复制代码


1.3读入csv文件
  1. data contact;
  2.      infile "E:\SAS\SAS-Yan\contact.csv"
  3.      dsd;#将多个相连的分隔符由空格改为逗号,csv必加
  4.      input name$ id$ test1 test2 gender$;
  5. run;
  6. title="contact.csv";
  7. proc print ;
  8. run;
复制代码

  1. data contact;
  2.      infile "E:\SAS\SAS-Yan\contact.csv"
  3.           dlm=":" #标明分隔符,等号后内容根据数据中的具体分隔符来定
  4.      dsd;
  5.      input name$ id$ test1 test2 gender$;
  6. run;
  7. title="contact.csv";
  8. proc print ;
  9. run;
复制代码


查找dlm其他用法

非标准格式读入
1.一行多观测,空格作为间隔 input语句后中加入@@ 行保持符
2.多行一观测,空格作为间隔 /表示下一行
3.混合
4.读取特定行
  1. data bank;
  2. infile "E:\SAS\SAS-Yan\lec3-170927\bank1q.txt" firstobs=3 obs=6;
  3. input @1 subj $3.
  4.            @4 dob mmddyy10.
  5.            @14 gender$1.
  6.            @15 balance7.
  7. ;
  8. format dob data9. balance dollar11.2;
  9. run;
  10. proc print data=bank;
  11. run;
复制代码



1.4基于列的操作运算
针对变量的操作:
-生成新的变量
–依据现有变量
–不依据现有变量
-删除已有变量
-修改已有变量
-给现有变量命名
-set keep drop rename 常用函数 复合判断语句 do-end语句块
  1. fileneme myfile "E:\data\chap1\garden0.dat";
  2. data garden;
  3. infile myfile;
  4. input name$ tomato$ zucchini  peas  grapes;
  5. zone=14; *建立新变量并直接赋值
  6. type="home";
  7. zucchini=zucchini*10;*改变已有变量
  8. total=tomato+zucchini+peas+grapes;
  9. periom=tomato/total;*利用原有变量计算新变量
  10. run;

  11. data garden1;
  12. set garden;
  13.       keep name total; *保留变量
  14. run;

  15. data garden2;
  16. set garden;
  17.      drop zone type; *删除变量
  18. run;

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

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

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

  39. data garden4(replace=yes);
  40. set garden;
  41. logtomato=log(tomato); *添加变量
  42. firstchar=substr(name,1,2); *添加变量,提取name前两个字母
  43. if grapes<50 then                *do--end 语句块,多变量嵌套
  44. do;
  45.     groupgrapes="low";
  46.     zone=16;
  47. else
  48. do;
  49.     groupgrapes="high";
  50.     zone=12;
  51. end;
  52. 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语句
-修改已有观测
  1. *排序
  2. filename myfile "文件夹路径";
  3. data marine;
  4. infile myfile(lengths.dat);
  5. input name$ family$ length@@;
  6. run;
  7. proc sort data=marine out=seasort nodupkey; *输出为数据集seasort,不加out时覆盖原有数据集;nodupkey删除冗余观测
  8. by family descending length; *先按family升序排列,再按length降序排列
  9. run;
  10. proc print data=seasort;
  11. title print data=seasort;;
  12. run;

  13. *提取指定条件的观测
  14. data seasort_whalel;
  15. set seasort;
  16. if Family="whale";
  17. run;
  18. *or
  19. data seasort_whalel;
  20. set seasort;
  21. where Family="whale";
  22. run;

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

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

  37. *添加新观测(像原有数据集中添加一条或者多条记录)
  38. data temp(replace=yes);
  39. input name$ family$ length;
  40. datalines;
  41. aaa  shark 60
  42. ;
  43. run;
  44. proc append base=marine data=temp;
  45. run;
  46. proc print data=marine;

  47. *删除指定的观测
  48. data marine;
  49. set marine;;
  50. if family="" then delete; *删除缺失值
  51. run;

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

  56. *重编码
  57. data marine;
  58. set marine;
  59. if family="" then family="unknown";
  60. run;

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

  67. libname chap1 "";
  68. proc transpose data=chap1.A out=chap1.TA name=course;
  69. /将数据集cha1.A转置成chap1.TA, 变量名name改为course*/
  70. var statistics chinese;          /*指定转置变量*/
  71. id name;                        
  72. run;
复制代码



1.7多数据集操作
–复制数据集 data +set
–拆分数据集 data+output
–合并数据集
  1. data marine0;
  2. set marine;
  3. run;

  4. *拆分数据集
  5. data whale shark(replace=yes);
  6. set marine0;
  7. if family="whale" then output whale;
  8. else if family="shark" then output=shark;
  9. run;

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

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

  19. *数据集横向合并
  20. libname chap1 "";
  21. proc sort data=chap1.C out=chap1.C;
  22. by name;
  23. run;
  24. proc sort data=chap1.D out=chap1.D;
  25. by name;
  26. run;
  27. /*以上对数据集chap1.C和chap1.D按照关键变量name升序排列/
  28. data chap1.CD;
  29. merge chap1.C  chap1.D;  /*横向合并数据集chap1.C和chap1.D*/
  30. by name;                   /*设置关键变量为id*/
  31. run;

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

  39. data _NULL_;
  40. x=0.1;
  41. y=1-(1-x)**50;
  42. y2=round(y,0.01);
  43. y4=round(y,0.0001);
  44. put y2= y4=;
  45. run;
复制代码



1.8循环语句
1.DO循环
格式:
DO 计数变量=起始值 TO 结束值 BY 步长;
循环体…;
END;
在循环体中可以用LEAVE语句跳出循环,使用COUNTRY语句结束本轮循环,调整计数变量进入下一轮循环。
  1. data chap2.example2_1;
  2. do x=5 to 30 by 5;           /*设置x的起始值为5,终止值为30,步长为5*/
  3. y=log(x);                  /*取y值为x的自然对数*/
  4. if y>3 then leave;           /*若y的值大于3结束循环*/
  5. output;
  6. format y 8.5;           /*定义y的输出形式为总长度为8位,小数部分占5位*/
  7. end;                  /*结束循环·*/

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



2.DO WHILE循环
格式:
DO WHILE 循环的语法结构;
DO WHILE(循环继续条件);
循环体语句;
END;
开始执行时,会先判断循环条件表达式的逻辑结果是否为真,若为真,则继续执行循环体语句,若为假则循环结束,循环语句每执行一次,检验循环条件一次
  1. data chap2.example2_2;
  2. y=100;     /*取y的初始值为100*/
  3. do x=2 to 10 by 2 while (y<3000);   /* 当y的值小于3000时,继续循环*/
  4. y=y*x;   /*y的值为前一次循环结束后y的值和当次循环x值的乘积*/
  5. output;
  6. end;
  7. run;
复制代码

3.DO UNTIL 循环
格式:
DO UNTIL (循环退去条件);
循环体语句…;
END;
语句开始执行,首循环体每执行一次都要判断是否满足循环退出条件,若循环退出条件表达式的逻辑结果为真,则退出循环,否则重复执行循环体语句
  1. data chap2.example2_2;
  2. y=100;     /*取y的初始值为100*/
  3. do x=2 to 10 by 2 until (y>=3000);   /* 当y的值大于等于3000时,退出循环*/
  4. y=y*x;   /*y的值为前一次循环结束后y的值和当次循环x值的乘积*/
  5. output;
  6. end;
  7. run;
复制代码

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


1.9条件分支结构 if-else in select
  1. *if-else
  2. data conditional;
  3. length gender $1 quiz $2;
  4. input age gender midterm quiz finalexam;
  5. if missing(age) then agegroup=.;  *缺失值
  6. else if age lt 20 then agegeoup=1;
  7. else if age lt 40 then agegroup=2;
  8. else if age lt 60 then agegroup=3;
  9. else if age ge 60 then agegroup=4;
  10. datalines;
复制代码

*写if语句时,一般将最容易出现的语句写在前面
  1. if quiz="A+" or quiz="A" or quiz="B+" or quiz="B" then quizrange=1;
  2. else if....
  3. 改为in
  4. if quiz in ("A+" "A" "B+" "B") then quizrange=1
复制代码

*用select结构进行逻辑判断代替一系列的if 和else if
  1. select(agegroup);
  2. when(1) limit=110;
  3. when(2)limit=120;
  4. when(3)limit=130;
  5. otherwise;
  6. end;
复制代码

*select-expresion 和when-expresion进行比较如果成功,执行其后语句并直接跳到select结构末尾。如果没有一次比较成功,执行otherwise后的语句,otherwise后的语句也可以为空。when语句可以包含多个比较值,例如“when(3,5) limit=130;”表示agegroup是3或5,则limit等于130.
*select后还可以是空语句,此时,每一条when都将通过比较决定与否
  1. data conditional;
  2. length gender$1 quiz$2;
  3. input age gender midterm quiz finalexam;
  4. select;
  5. when (missing(age)) agegroup=.";
  6. when (age lt 20) agegroup=1;
  7. when (age lt 40) agegroup=2;
  8. when (age lt 60)agrgroup=3:
  9. when (age ge 60)agegroup=4;
  10. otherwise;
  11. end;
  12. datalines;
  13. ......
复制代码




1.10 ODS输出系统
ODS能让用户选择以各种美观的格式报告和显示分析结果,使用DOCUMENT过程,可以生成多个ODS输出控制文档内容的去留及显示格式而不必反复运行过程和查询。
主要支持格式:
RTF 多文本文件格式
OUTPUT SAS数据集格式
LISTING
HTML
PRINTET
ODS输出RTF文档格式:
  1. ODS LISTING CLOSE; /用户不创建列表输出/
  2. ODS RTF FILE="文件名.RTF"
  3. ...;
  4. ODS RTF CLOSE;
  5. ODS CLOSE;
复制代码

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

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


1.11export输出
Proc EXPORT
Data=数据集
OUTFILR=为导出的数据命名
DBMS=数据类型标识符
;
Run;
  1. proc export data=sashelp.prdsale
  2. outfile='C:\Users\SJ\Desktop\prdsale.csv'
  3. dbms=csv replace;
  4. delimiter=',';    #指定分隔符
  5. putnames=no;   #是否将SAS变量名作为列名写入文件的第一行,默认为Yes
  6. run;
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表