二、排序、打印和汇总数据

1、where语句生成子集

语法:where condition
放在proc print xxx之后。
Mary Cassatt ,Impressionism ,U
Paul Cezanne ,Post-impressionism,F
Edgar Degas ,Impressionism ,F
Paul Gauguin ,Post-impressionism,F
Claude Monet ,Impressionism ,F
Pierre Auguste Renoir,Impressionism ,F
Vincent van Gogh ,Post-mpressionism,N
要求:变量Name,Genre,Origin。将Genre为Impressionism的数据输出,并给出F=France,N=Netherland,U=USA的标注。

结果:

注:

  1. 读取数据时,变量Name和Genre数据值过长,一定要有冒号的格式读取,要不然Impressionism无法完整读取,后面where语句Genre='Impressionism’也就继续不了;
  2. fotnote=‘xxxx’ xxxx是标志内容,打印出来在页面底部。

2、proc sort对数据排序

语法proc sort data=xx out=xxx;
诸如nodupkey(删除具有相同by变量值的观测),dupout=xxxx(将删除的观测输出到指定的数据集中)等语句可以放在proc sort语句中。
beluga,whale,15,dwarf,shark,0.5,sperm,whale,60
basking,shark,30,humpback, ,50,whale,shark,40
qray,whale,50,blue,whale,100,killer,whale,30
mako,shark,12,whale,shark,40
要求:变量Name,Type,Length;用by语句将数据先按Type升序再按Length降序。

结果:

注: 在原文件中缺失值处要打一个空格,如果没有打空格直接是两个逗号会被无视,读成下面的结果,读csv文件明明两个连续逗号默认为缺失值,不知道这里怎么没有成功。

3、字符数据的排序

ASCII 空格 数字 大写字母 小写字母
EBCDIC 空格 小写字母 大写字母 数字
proc sort sortseq=linguistic (strength=primary):忽略大小写
proc sort sortseq=linguistic (numeric_collation=on):将数字当作数值处理
Seiki,100 A St. ,juneau,alaska
Wong,2 A St. ,Honolulu,Hawaii
Shaw,10 A St. Apt. 10,Juneau,Alaska
Smith,10 A St. Apt. 2 ,honolulu,hawaii
要求:变量为Name,Street,City,State,生成两个数据集,一个按数值大小(by Street)排序,一个不区分大小写排序(by State)。

结果:


注: 输出语句不要涂方便直接写成了proc print data=Address_sort data=Address_sort_1;
第二个数据集会被忽略。

4、proc print中的选项

proc print noobs label;noobs去掉输出的obs观测序号,label添加标签,暂时还不知道怎么用,见后面。
Adriana,21,3/21/2012,MP,7
Nathan,14,3/21/2012,CD,19
Matthew,14,3/21/2012,CD,14
Claire,14,3/22/2012,CD,11
Ian,21,3/24/2012,MP,18
Chris,14,3/25/2012,CD,6
Anthony,21,3/25/2012,MP,13
Erika,21,3/25/2012,MP,17
要求:变量Name,Class,Date,Type,Quantity。制作报表:利润为数量*1.5,按班级排序,计算每个学生的利润,每个班的利润,用var打印出Name,Date,Type,Profit。

结果:

注:

  1. proc sort和proc print都用了by class,因为既要按班级给所有变量排序,又要将利润按班级汇总;
  2. 这里日期直接输出文件里日期形式,直接将Date当成字符,没有格式化输出,因为用infile语句读数据,我还没成功过mmddyyw.的日期格式化输出,用cards语句倒是可以,见下面(这里没有将利润按班级汇总,而是直接给出总利润):

5、自定义格式proc format

语法:
proc format;
value name1 变值1=‘格式值1’
变值2=‘格式值2’
变值3=‘格式值3’
……;
$ name2 变值1=‘格式值1’
变值2=‘格式值2’
变值3=‘格式值3’
……;
name1和name2分别是要格式化的变量名称,变量值是字符要加$
.
例:19,1,14000,Y
45,1,65000,G
72,2,35000,B
31,1,44000,Y
58,2,83000,W
要求:变量为age,sex,income,color。将变量格式化为:agegroup(13-20为teenager,20-65为adult,65以上为senior);gender(1=Male,2=Female);col(Y为yellow,B为bule,W为white,G为gray)。

结果:

注:

  1. 每个格式化后的变量名前面的value不要忘了;
  2. 每一段自定义的格式代码末尾分号不要忘了;
  3. proc format是一个单独的proc过程;format语句在proc print中,格式语句是 旧变量名 新变量名. 旧变量名 新变量名.
    一一对应,实心点不要忘了。

6、proc means汇总数据

proc means options后面可跟选项:
maxdec=n #指定显示的小数位数
missing #将缺失值视为有效值

汇总统计量(若不指定,则打印非缺失值个数、均值、标准差、最小值、最大值):
max #最大值
min #最小值
median #中位数
mode #众数
n #非缺失值个数
nmiss #缺失值个数
range #极差
stddev #标准差
sum #总和

proc means可选语句:
by variable #排序后为该变量的每个水平执行单独的分析
class variable #不需要排序,为该变量的每个水平执行单独的分析
var variable #最后打印出指定的变量,若没有该语句则打印出所有变量

756-01,05/04/2013,120,80,110
834-01,05/12/2013,90,160,60
901-02,05/18/2013,50,100,75
834-01,06/01/2013,80,60,100
756-01,06/11/2013,100,160,75
901-02,06/19/2013,60,60,60
756-01,06/25/2013,85,110,100
要求:变量为ID,Saledate,flower1,flower2,flower3。产生新变量Month并按Month排序,用by语句的proc means按Month汇总数据,maxdec设置为0。

结果:

7、将汇总统计量写入数据集

仍然是上节园林花卉的数据,上节是对每种花作统计量分析,本节是对七条观测里三个ID的每种花做分析。
用output语句将汇总统计量保存到sas数据集里:
output out=data_name output-statistic-list;
output-statistic-list可以是statistic(variable-list)=name-list等,statistic可以是proc means提供的任何一种统计量。例:

756-01,05/04/2013,120,80,110
834-01,05/12/2013,90,160,60
901-02,05/18/2013,50,100,75
834-01,06/01/2013,80,60,100
756-01,06/11/2013,100,160,75
901-02,06/19/2013,60,60,60
756-01,06/25/2013,85,110,100
要求:变量为ID,Saledate,flower1,flower2,flower3。汇总三个ID中每种花的均值和总和等统计量。

结果:

proc means中的by语句千万不要忘了,否则会是以下结果:

8、简单的proc freq频数交叉表

语法格式:
proc freq;
table a; #单向计数变量a的频数
table a * b; #变量a和b的交叉表

可选选项(如table a * b /missing;):

例:
esp,w,cap,d,cap,w,kon,w,ice,w,kon,d,esp,d,kon,w,ice,d,esp,d
cap,w,esp,d,cap,d,kon,d,.,d,kon,w,esp,d,cap,w,ice,w,kon,w
kon,w,kon,w,ice,d,esp,d,kon,w,esp,d,esp,w,kon,w,cap,w,kon,w
要求:变量为coffee、type。分别打印type以及coffee和type的交叉频数表。

结果:

注: 以第一格为例,6.90是6.90%=2/29,16.67%=2/12,33.33%=2/6

9、proc tabulate过程

9.1 proc tabulate生成数据报表

一般形式:
proc tabulate;
class classification-variable-list; #告诉sas有哪些分类变量将进行分组
table page-dimension,row-dimension,column-dimension;
#分别表示页,行,列
注: table中只有一个维度时表示列;有两个维度表示行、列;有三个维度表示页、行、列。

例:
Silent Lady ,Maalea,sail,sch,95.00,64
America II ,Maalea,sail,yac,72.95,65
Aloha Anai ,Lahaina,sail,cat,112.00,60
Ocean Spirit,Maalea,power,cat,62.00,65
Anuenue ,Maalea,sail,sch,177.50,52
Hana Lei ,Maalea,power,cat,88.99,110
Leilani ,Maalea,power,yac,99.99,45
Kalakaua ,Maalea,power,cat,69.50,70
Reef Runner ,Lahaina,power,yac,59.95,50
Blue Dolphin,Maalea,sail,cat,92.95,65
要求:变量为name(名字),port(船港籍),locomotion(帆船还是机动船),type,price,length。用proc tabulate创建port、locomotion和type的三维报表。

结果:

9.2 将统计量添加到proc tabulate的输出

proc tabulate;
var analysis-variable-list;#告诉sas包含哪些连续数据
class classification-variable-list; #告诉sas有哪些分类变量将进行分组
table page-dimension,row-dimension,column-dimension;
#分别表示页,行,列;table语句中的所有变量必须出现在class或var中
关键字:

例:Silent Lady ,Maalea,sail,sch,95.00,64
America II ,Maalea,sail,yac,72.95,65
Aloha Anai ,Lahaina,sail,cat,112.00,60
Ocean Spirit,Maalea,power,cat,62.00,65
Anuenue ,Maalea,sail,sch,177.50,52
Hana Lei ,Maalea,power,cat,88.99,110
Leilani ,Maalea,power,yac,99.99,45
Kalakaua ,Maalea,power,cat,69.50,70
Reef Runner ,Lahaina,power,yac,59.95,50
Blue Dolphin,Maalea,sail,cat,92.95,65
要求:变量为name(名字),port(船港籍),locomotion(帆船还是机动船),type,price,length。行维将分类变量locomotion与all连接生成合计,列维将mean与分析变量price和分类变量type(它与all连接和分组)。

结果:

注: class里面写分类变量名,var里面写连续变量名(本例的price就是分析的变量)。

9.3 美化proc tabulate输出

format= 选项 #必须在proc tabulate中
box=和misstext=选项 #box=可以在报表的左上角通常为空白的框内写入短语,misstext=指定缺失值的单元格内的内容。这两个选项可以放在table语句中。

Silent Lady ,Maalea,sail,sch,95.00,64
America II ,Maalea,sail,yac,72.95,65
Aloha Anai ,Lahaina,sail,cat,112.00,60
Ocean Spirit,Maalea,power,cat,62.00,65
Anuenue ,Maalea,sail,sch,177.50,52
Hana Lei ,Maalea,power,cat,88.99,110
Leilani ,Maalea,power,yac,99.99,45
Kalakaua ,Maalea,power,cat,69.50,70
Reef Runner ,Lahaina,power,yac,59.95,50
Blue Dolphin,Maalea,sail,cat,92.95,65
要求:变量为name(名字),port(船港籍),locomotion(帆船还是机动船),type,price,length。

结果:

9.4 更改proc tabulate输出的表标题

tabulate报表有两种基本类型的标题:

  1. class语句中列出的分类变量
    修改:可以使用format过程触及创建用户自定义的输出格式,见第5节。
  2. 变量名和关键字
    修改:可以将等号放置在变量或关键字之后,后面跟着括在引号里的新标题。引号内容为空则消除标题。
    Silent Lady ,Maalea,sail,sch,95.00,64
    America II ,Maalea,sail,yac,72.95,65
    Aloha Anai ,Lahaina,sail,cat,112.00,60
    Ocean Spirit,Maalea,power,cat,62.00,65
    Anuenue ,Maalea,sail,sch,177.50,52
    Hana Lei ,Maalea,power,cat,88.99,110
    Leilani ,Maalea,power,yac,99.99,45
    Kalakaua ,Maalea,power,cat,69.50,70
    Reef Runner ,Lahaina,power,yac,59.95,50
    Blue Dolphin,Maalea,sail,cat,92.95,65
    要求:变量为name(名字),port(船港籍),locomotion(帆船还是机动船),type,price,length。将mean、locomotion、type标题设置为空白;将price标题设置为’Mean price by type of Boat’;自定义type中各类型为
    sch=‘schooner’
    yac=‘yacht’
    cat=‘catamaran’


    结果:

注:

  1. proc format自定义完了之后并没有结束,还有format type $typ.;语句不要忘了写在proc tabulate中;
  2. 改标题是在table语句中,不要在var和class中;
  3. 将标题设置为空白,则这个标题行或列就没有了,就不会像上一节那样不美观。

9.5 为proc tabulate输出的数据单元格指定多种输出格式

如上例,将length与price同等交叉,其他格式仍然与上节要求一样,会发现length的数据也以美元形式输出:


于是在table中,在变量后用format语句,比较简便
mean=’’ * (price * format=dollar7.2 length * format=2.0)*(type all)

10、proc report过程

10.1 proc report生成简单输出

基本形式:
proc report nowindows; #从sas9.4开始,nowindows可省略
column variable-list; #column类似于print过程中的var语句,用于指定report过程使用哪些变量,以及这些变量采用何种排序

例:
Dinosaur ,NM,West,2,6
Ellis Island ,NM,East,1,0
Everglades ,NP,East,5,2
Grand Canyon ,NP,West,5,3
Great Smoky Mountains,NP,East,3,10
Hawaii Volcanoes ,NP,West,2,2
Lava Beds ,NM,West,1,1
Statue of Liberty ,NM,East,1,0
Theodore Roosevelt ,NP,.,2,2
Yellowstone ,NP,West,2,11
Yosemite ,NP,West,2,13
要求:变量为name,type,area,Muquanty,Caquanty。生成两个report过程,一个用column语句选择Muquanty和Caquanty这两个数值变量。

结果:
report过程与print过程输出结果相似,只是没有obs。

10.2 在proc report中使用define语句

define语句用于对单个变量指定特定的选项。
一般形式:
define variable / option ‘column-header’;
常用的用法选项:

如define age / order ‘Age at admission’;
按变量age排序并修改其标题为Age at admission。

例:数据同上。要求:变量为name,type,area,Muquanty,Caquanty。按area排序,再将Caquanty标题改为Campquantity。

结果:

10.3 proc report创建汇总报表

Group用法选项生成行维度的数据汇总,Across用法选项生成列维度的数据汇总。
数据如上:

结果:

把第9节数据用proc report数据汇总如下:


但是汇总显然没有意义,因为长度length相加没有意义。

10.4 在proc report输出中添加汇总分割

两种汇总分割方式:

  1. break语句会为指定变量的每个唯一值添加分割
  2. rbreak为整个报表添加分割(如果使用了by语句,则会为每个by分组添加)

break location variable / options;
rbreak location / options;
location有两个取值:before和after,分割出现在报表指定部分之前或之后。
斜杠后的选项用于指定添加何种类型的分割。常用的选项:
page #开始新的一页
summarize #为数值变量插入汇总统计量

例:Dinosaur ,NM,West,2,6
Ellis Island ,NM,East,1,0
Everglades ,NP,East,5,2
Grand Canyon ,NP,West,5,3
Great Smoky Mountains,NP,East,3,10
Hawaii Volcanoes ,NP,West,2,2
Lava Beds ,NM,West,1,1
Statue of Liberty ,NM,East,1,0
Theodore Roosevelt ,NP,.,2,2
Yellowstone ,NP,West,2,11
Yosemite ,NP,West,2,13
要求:对area汇总分割,在area之后。


注: define语句别忘了,只能对“排序变量”分段。

10.5 在proc report输出中添加统计量

最简单的是直接在column中插入相应的统计量关键字和待计算的变量名称。tabulate过程中是通过在table语句中用乘号将变量与统计量关联起来,而column语句是通过逗号实现的。report过程可以计算tabulate过程和means过程能计算的所有统计量。

一般形式如:
column age,mean n #为age变量计算两个统计量
column age,(min max) (height weight),mean #为变量height和weight计算同一个统计量

Dinosaur ,NM,West,2,6
Ellis Island ,NM,East,1,0
Everglades ,NP,East,5,2
Grand Canyon ,NP,West,5,3
Great Smoky Mountains,NP,East,3,10
Hawaii Volcanoes ,NP,West,2,2
Lava Beds ,NM,West,1,1
Statue of Liberty ,NM,East,1,0
Theodore Roosevelt ,NP,.,2,2
Yellowstone ,NP,West,2,11
Yosemite ,NP,West,2,13
要求:第一个report过程将type作为分组变量,计算统计量n,数值变量Muquanty和Caquanty计算均值。第二个report过程将type作为交叉变量,与两个数值变量交叉,将area作为分组变量,统计量有n、mean。

第二个report过程中: 统计量n与变量关联时不需要逗号;第一个逗号表示交叉变量type与数值变量进行交叉的格式,第二个逗号表示变量与统计量mean关联的格式。

结果:

10.6 在proc report输出中添加计算变量

新变量是通过计算块创建的:
define new-variable-name / computed;
compute new-variable-name / options;
programing statements;
endcomp;
中间的编程语句仅限于:赋值语句、if-then/else语句、do循环语句。
计算数值变量:
如:
define income / computed;
compute income=salary.sum + bonus.sum; #分析变量默认的统计量是sum
endcomp;
计算字符变量:
如:
define Jobtype / computed;
compute Jobtype / char length=10;
if title=‘programmer’ then Jobtype=‘technical’ ;
else Jobtype=‘other’;
endcomp;

例:Dinosaur ,NM,West,2,6
Ellis Island ,NM,East,1,0
Everglades ,NP,East,5,2
Grand Canyon ,NP,West,5,3
Great Smoky Mountains,NP,East,3,10
Hawaii Volcanoes ,NP,West,2,2
Lava Beds ,NM,West,1,1
Statue of Liberty ,NM,East,1,0
Theodore Roosevelt ,NP,.,2,2
Yellowstone ,NP,West,2,11
Yosemite ,NP,West,2,13
要求:添加新变量facilities和note。facilities是数值变量,为Muquanty和Caquanty之和;note是字符变量,若Caquanty为0,则其值为“No Camping”。

Caquanty.sum我没明白。
结果:

10.7 在过程步中使用用户自定义输出格式分组数据

使用这种方式完成分组,需要两个步骤:第一步,使用format过程创建输出格式,将需要分组的所有的值赋给一个文本字符串;第二步,在过程步中使用format语句,为需要分组的变量指定输出格式。
例:17,sci,9,bio,28,fic,50,mys,13,fic,32,fic,67,fic,81,non,38,non
53,non,16,sci,15,bio,61,fic,52,ref,22,mys,76,bio,37,fic,86,fic
49,mys,78,non,45,sci,64,bio,8,fic,11,non,41,fic,46,ref,69,fic
34,fic,26,mys,23,sci,74,ref,15,sci,27,fic,23,mys,63,fic,78,non
40,bio,12,fic,29,fic,54,mys,67,fic,60,fic,38,sci,42,fic,80,fic
要求:变量为age,booktype。创建三个输出格式:
agegra 0-18=‘teen’
19-44=‘adult’
45-60=‘middle aged’
61-high=‘old’;
agegrb 0-25=‘0 to 25’
26-high=‘25+’;
typ ‘bio’,‘non’,‘ref’=‘Non-Fiction’
‘fic’,‘mys’,‘sci’=‘Fiction’。

结果:


如果不需要百分比以及行列的百分比,就在table后加上nopercent,nocol,norow。nopercent千万不要写成了noprint,noprint是不输出结果。

结果:

SAS学习笔记(二)排序、打印和汇总数据相关推荐

  1. Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )

    Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...

  2. mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考

    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型. ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定哪 ...

  3. SAS学习笔记1——基础知识(库、PDV、变量选择、观测值排序、创建新变量

    SAS学习笔记1--基础知识 1.逻辑库.临时库.永久库 2.数据步 2.1数据步语法 2.2 数据步的编译和执行过程 2.3变量的选择 2.3.1 keep和drop语句 2.4变量的重命名rena ...

  4. SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理...

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(3)变量操作.观测值操作.SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 ...

  5. SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(3)变量操作.观测值操作.SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 ...

  6. SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制...

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...

  7. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  8. SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定 ...

  9. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

最新文章

  1. winscp linux中文文件夹名称乱码,解决windows传送到linux下中文文件名及文件内容乱码问题...
  2. 采用三层架构(JAVA)设计学生管理系统
  3. pyspark reduce代码示例
  4. IP地址的分类——a,b,c 类是怎样划分的
  5. Linux下C++访问MySQL数据库
  6. python 几种点积运算方式效率分析
  7. KMP算法理解(转)
  8. JavaFX图表(三)之折线图
  9. 净值:测试编码器/解码器
  10. JS每隔一段时间执行一个方法
  11. FFTNTT数学解释
  12. linux 下载hbase源码,linux上安装hbase(示例代码)
  13. Go http Server
  14. 何新生的英语史(八)—看好莱坞学英语,就是这么简单 1
  15. C# 操作Excel加水印
  16. 重装战姬服务器维护,重装战姬2020年10月1日更新维护公告_重装战姬2020年10月1日更新了什么_玩游戏网...
  17. 使用mysql workbench显示Tables/Views could not be fetched
  18. 《Building Simulation》期刊介绍(SCI 2区)
  19. 西门子SMART200程序 PID的控制写法,突破8路
  20. iOS Password AutoFill开发指南

热门文章

  1. UIview 添加触摸.手势
  2. 运维祈求不宕机_一份运维监控的终极秘籍!监控不到位,宕机两行泪
  3. 【转】在线网页取色器
  4. Python计算机二级大题
  5. 设计模式面试题整理-四年经验
  6. 如何对PDF文件中的内容进行编辑修改
  7. 前端从一只小白到工作半年的心路历程
  8. 王者荣耀4.4日服务器维护,王者荣耀:4.4全天停服更新,只为响应全国性“悼念活动”!...
  9. 微信公众号接入和获取用户信息
  10. linux indent添加,linux indent格式化代码