SAS编程基础(2):常用 数据步与过程步

  • Post author:
  • Post category:其他


/*

2018/11/29 SAS开发学习 常用语法及关键字

数据集合并:merge set

排序:proc sort

转置:proc transpose

写sql语句:proc sql

频数统计:proc freq

proc hpsummary

统计分析:proc means

proc univariate

proc logistic

*/

/* 数据步与过程步

/

/

数据步 读取处理数据

常用关键字

data 创建数据集 <参数选项>

SAS 处理数据集语句

run; 结束

set

merge

*/

data students (keep=name sex class address);

length address $30;

input id name $ sex $ class address;

cards;

1001 高溪红 F 1 衡阳神龙大酒店

1002 张明明 M 2 北京市东城区

;

run;

/* data 数据步 及过滤 */

libname jx “d:\jx”;

%let dir=“d:\jx\cust.bat”;

filename fil “(&dir)”;

data jx.open_bj jx.other;

infile fil;

input zone $ open_count city $;

if city in (“北京”, “青岛”) then output jx.open_bj;

else output jx.other;

run;

libname jx “d:\jx”;

%let dir=“d:\jx\cust.bat”;

filename fil “(&dir)”;

data cust;

infile fil;

input zone $ open_count city $;

run;

data

jx.bj


set cust (where=(city in (“北京”, “青岛”);

run;

/* set语句

/

data stu;

set student (keep=name sex address obs=1);

run;

/

set以及过滤

/

data stu;

set student (keep=name sex address);

if sex=“F”;

run;

/

merge 语句 将两个或多个数据集进行横向合并

语法: MERGE <数据集1> <选项> <数据集2> <选项>

常用选项: keep drop rename where in

一对一合并和匹配合并


/

data inf_stu;

length address $30;

input id name $ sex $ class address;

cards;

1001 ltf M 01 湖南省衡阳市

1002 hch F 02 湖南省长沙市

;

run;

data score_stu;

input id score;

cards;

1001 99

1002 100

;

run;

proc sort data=inf_stu;

by id;

run;

proc sort data=score_stu;

by id;

run;

data inf_score (keep=id name score);

merge inf_stu score_stu;

by id;

run;

/

查找两个数据集中相同的数据 byid

data inf_score (keep=id name score);

merge inf_stu(in=a) score_stu(in=b);

if a and b;

by id;

run;

查找两个数据集中不同的数据 byid

data inf_score (keep=id name score);

merge inf_stu(in=a) score_stu(in=b);

if ^a and b;

by id;

run;

*/

/* 数据集应用案列

/

/


数据集条件过滤

取数据

删数据

*/

%let dir=“d:\jx\custer.bat”;

filename fil “(&dir)”;

libname jx “d:\jx”;

data jx.card138;

infile fil dsd missover;

input @20 card_type $3. @;

if card_type=“138” then do;

input @1 qh $3.

@4 card_nm $16.

@23 name $8.

@31 address :$20.

;

ouput jx.card138;

end;

run;

%let dir=“d:\jx\custer.bat”;

filename fil “(&dir)”;

libname jx “d:\jx”;

data jx.card138;

infile fil dsd missover;

input @20 card_type $3. @;

if card_type=“138” then delete;

if card_type^=“138” then do;

input @1 qh $3.

@4 card_nm $16.

@23 name $8.

@31 address :$20.

;

ouput jx.card138;

end;

run;

/* 宏过程 %macro 其实就相当于定义函数 */

%let dir=“d:\jx\inf_cust.dat”;

filename sj “(&dir)”;

libname csj “d:\jx”;

%macro loadfile(v_lib);

data &v_lib.inf_custer;

infile sj firstobs=2 end=final length=length;

input @1 qh $3.

@4 card_nm $16.

@20 card_type $3.

@23 name $8.

@31 address :$20.

;

run;

%mend;

%%loadfile(csj.);

/* 使用宏变量 进行模糊查询

/

data city_inf;

length city $30.;

input id city $;

cards;

1001 上海市南京路

1002 北京西城区

1003 上海市浦东区

1004 天津滨海新区

1005 北京东城区

1006 山东济宁

1007 山东济南

1008 北京市丰台区

;

run;

/

通过宏实现模糊查询 1.多参数 2.条件语句

/

%macro indexs/PARMBUFF; /

parambyff 可接受多个参数

/

%local num dsname; /

局部变量 定义局部变量

/

%let num=2;

%let dsname=%scan(&syspbuff, &num);

/

parabuff 信息传递到 dsname scan函数实现查找功能 这里把num=2 第二个变量开始查找 */

%do %while(%quote(&dsname) ne %quote());

%if &name>2 %then %do;

or

%end;

index(%scan(&syspbuff, 1), “&dsname”)>0

%let num=%eval(&num+1);

%let dsname=%scan(&syspbuff, &num);

%end;

%mend;

data city;

set city_inf;

where %indexes(city, 北京, 上海, 山东);

run;

proc print data=city;

run;

/* call 子程序数据步应用 */

%macro callpro(v_param);

data

null

;

x=“we”;

z=&v_param;

call symput(“v_var”, x);

%mend callpro;

%callpro(1);

run;

data temp;

y=”&v_var”;

run;

proc print data=temp;

run;

/* 数据集输出应用

  1. 数据集输出到临时逻辑库 sas默认是work逻辑库 work可以省略
  2. 数据集输出到永久逻辑库 libname创建永久逻辑路 Libname 逻辑库名 物理路径

    */

/* 关系型数据库数据处理

/

/

链接关系型数据库的两种方式

  1. 创建永久逻辑库 读取

  2. 通过 pass through 的方式,其就是在 proc sql 里面 连接操作mysql数据库


    /

    /


    libname test mysql user=root password=sas123 database=mydb

    server=localhost port=3306;


    /

    /


    proc sql;

    connect to mysql

    (user=root password=sas123 server=localhost

    database=world port=3306);

    create table b as select * from connection to mysql

    (select * from city);

    execute(create table cc as select * from aa
    

    )by mysql;

    disconnect from mysql;

    quit;

    */

/* 过程步 对生成的数据集进行分析和处理

语法格式: PROC 过程名 <DATA=数据集名> <选项>;

过程语句 <参数选项>;

run;

var 指定分析变量 多个变量用空格分隔

by 指定一个过多个分组变量对数据集分组 数据集要先排序

class 指定一个或多个分类变量 不需要事先对数据集排序

model 建模中 指定模型的因变量和自变量 以及相关模型选项

ferq 指定用于分析变量的频数变量

weight 指定权数变量 已获得该变量占百分比的权重

id 指定观测变量 输出会去掉obs选项标识

output 对分析结果输出到新数据集

where 条件选项语句

title 输出文件加入标题信息

footnote 输出文件加入脚注信息

options 通过此语句设置 改变sas系统的默认设置

*/

data score;

input id name $ class math english chinese;

cards;

1001 高明 1 89 78 89

1002 中海 1 76 99 78

1003 刘海洋 1 88 56 66

1004 杨小帅 1 99 89 98

1005 赵晓红 1 87 86 83

1006 马西瑞 1 89 58 43

;

run;

proc means data=score sum min max;

var math english chinese;

run;

/*

排序:proc sort

转置:proc transpose

写sql语句:proc sql

频数统计:proc freq

proc hpsummary

统计分析:proc means

proc univariate

proc logistic

*/

/* print过程 */

data score;

input id name $ class math english chinese;

cards;

1001 高明 1 89 78 89

1002 中海 1 76 99 78

1003 刘海洋 1 88 56 66

1004 杨小帅 1 99 89 98

1005 赵晓红 1 87 86 83

1006 马西瑞 1 89 58 43

;

run;

proc print data=score noobs;

where math>80 and english>80 and chinese>80;

titile “各科成绩大于80分的学生信息”;

run;

/* means 过程 t检验

/

data tcheck;

input milck @@;

milck=milck-450;

cards;

452 436 447 439 445 460 442 456 447 440

;

run;

proc means data=tcheck t prt;

run;

/

copy过程 复制一个逻辑库下所有的数据集到另一个逻辑库下 或者从一个文件复制到另一个文件

语法格式:

proc copy in=源逻辑库 out=目标逻辑库 <memtype=成员类型><move <alter=修改密码><index=YES|NO>;

SELECT 成员名</<memtype=成员类型><alter=修改密码>;

EXCLUDE 成员名<memtype=成员类型>;

run;

*/

/* SQL 过程 实现关系数据库的结构化查询功能

语法格式: proc sql <选项>;

数据操纵语言;

quit;

*/

/* report 过程 制作报表的工具

语法格式: proc report <报表选项>;

常用报表设置语句;

run;

常用关键字:

headline: 指定表头画线

headskip: 指定一空行

title: 指定主标题

title2: 指定副标题

column: 指定报表显示列

define: 对报表显示列定义属性

compute: 指定计算列 其结束语句为endcomp

*/

/* freq 过程 计数统计推断

作用1: 描述分析

作用2: 统计推断 产生各种统计量 可分析变量间的关系

语法格式:

proc freq <选项>;

by 变量1 <变量2> … <变量n>;

exact 统计选项</计算选项>;

output <out=数据集名> 选项;

tables requests </选项>;

test 选项;

weight 变量名</选项>;

run;


/

data yb;

input group $ row colm fre;

cards;

甲组 1 1 49

甲组 1 2 50

乙组 2 1 52

乙组 2 2 48

丙组 3 1 47

丙组 3 2 53

;

run;

proc freq data=yb;

tables group;

/

weight fre;

/

run;

/

summary 过程 主要用来对数值变量计算单个变量的基本统计量

语法格式:

proc summary <选项> <统计关键量>;

var 变量名;

by 变量名;

class 变量名;

freq 变量名;

weight 变量名;

ID 变量名;

output 数据集名 选项;

run;

*/

data students;

input group age height weight sex $;

cards;

2 35 162 42 f

1 31 173 43 m

2 42 156 56 f

1 53 152 39 f

1 42 173 63 m

1 28 165 55 f

2 33 157 66 f

2 17 162 46 f

1 16 173 45 m

1 25 180 66 m

;

run;

proc sort data=students;

by group;

proc summary data=students mean std n max min range stderr cv;

var age height weight;

class sex;

by group;

output out=stu_analy;

proc print data=stu_analy;

run;

/* compare 过程 主要用来比较两个数据集的内容

语法格式:

proc compare <选项>;

var 变量名;

by 变量名;

id 变量名;

with 变量名;

run;

*/



版权声明:本文为troysps原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。