sas入门-笔记2 SAS语言

(二)SAS语言

1、概述

基本概念:SAS语言的基本单位是语句;多条SAS语句构成一个SAS程序(文件后缀 .SAS)

(1)语句构成:关键词+SAS名称+特殊字符、运算符;(关键词由系统定义的、有确定含义的符号。一般位于句首,用以说明语句的类型和功能)

语言书写规则:

语句可以从某一行的任意位置开始;
一条语句可以写成几行;
一行可以写几条语句;
不区分大小写;
注释语句的两种格式: /* 注释内容 */      * 注释内容;
(2)程序构成:一个SAS程序就是由0个或若干个数据步、过程步组成,有时还包括一些全程语句用以贯穿控制整个SAS程序的某些选项、变量或程序运行的环境

数据步 :以关键词DATA开始,通常用于创建SAS数据集,对数据进行处理,如计算、挑选。输出形式为SAS数据集或报表等,也可以将结果写到日志窗口或外部文件中。

过程步:以关键词PROC开始, 通常用于分析和处理SAS数据集中的数据,绘制图表,展现数据集的信息等功能。

全程语句:位于数据步和过程步之外,例如:TITLE语句用于指定标题;OPTION语句用于规定系统运行的一些选项。

SAS程序结束语句:RUN;单击工具栏“提交”按钮,或单击热键F8,或选择菜单 “运行”/“提交”命令进行程序的运行。

2、数据步即data步

(1)用DATA步创建数据集

两种方式:自定义创建数据集;外部文件创建数据集

*/
方式一:直接创建,[]表示可省略内容
DATA [逻辑库名.]<创建的数据集名>;
INPUT <变量名1>[$] <变量名2>[$]… <变量名n>[$][@@];  *定义变量,@@ 便于接着读入后续的数;
[其他数据步语句];
CARDS;
d11 d12 …d1k                                      *变量赋值
d21 d22 …d2k 
…. …
[ ; ]                                             *分号单独占用一行;
RUN;
*/*案例;
data temp1;
input name$ age@@;
cards;
Tom 34 johny 22 mary 34
Susan 26 Dora 29 Young 30
;
run;*/方式二:外部数据导入的方式
DATA <数据集名>;
INFILE '<文件路径>';                               *注意文件路径加引号;
INPUT <变量名1> [$]<变量名2>[$]… <变量名n>[$];      *定义变量
RUN;
*/*案例;
data temp2;
infile ‘d:\mydata\stud.txt’;
input id $ name $ sex $ age hometown $ ;
run;

其中DATA语句 [格式] 逻辑库名.数据集名;[功能] 标志数据步的开始,并定义新建数据集的名称。

INPUT语句 [格式] 下方详细阐述;[功能] 为相应数据定义变量; 告知SAS如何读取数据

CARDS语句 [功能] 表明后面是数据行;cards必须与input配合使用;一个data步中只能使用一个

INFILE语句  [格式] input ‘文件路径’;[功能] 用于从外部文件读入数据,必须出现在INPUT语句之前。 文件路径中不包含变量名,使用反斜杠,“/”

延申:从外部数据导入数据集

data;
infile "sales2.txt" dlm="," firstobs=2;  *dlm表示数据用什么分割,firstobs从第几行开始录入数据;
input storeid $9. Q1-Q4;                 *7. 字符长度; 
RUN;

(2)定义变量语句即INPUT语句

格式:input 变量名1 [变量输入格式1] [列标识符] ... 变量名n [变量输入格式n] [列标识符][@@]

@@表示cards后的数据是可以依次读取的,不用写换行符

  • 自由格式
    data work.score;
    input id $ name $ Math Chinese English;
    cards;
    201501001 周国兴 90 80 85 
    201501002 李铭 70 78 81 
    201502003 彭晓钢 92 89 86
    201502004 胡大伟 80 90 95
    201502005 陈小寒 65 85 78 
    201503001 代平安 88 75 88
    run;

    在INPUT语句的变量名应和数据列表中的列数一一对应。 数据每行为一个观测,各数据值之间用空格或制表符分隔;如果存在缺失数据,无论是字符型还是数值型都要用小数点 (.)表示;字符型数据长度不能超过8个字符,中间不允许有空格,开头和结尾如果有空格将被忽略。

  • 列标识格式

    *值包含空格;
    data stud_space;
    input id $ 1-9 name $ 12-24 math 26-28;
    cards;
    201531001 Tom Welis 92
    201531002 Jack Swift 85
    ;
    run;*值没有空格;
    data CarInfo;
    input num 1-3 month $ 4-6 year 7-10 id $ 11-16;
    cards;
    001jan2015BJ9078 
    002jan2015HK8559 
    003jan2015NY5576 
    run;
    

    列标识格式的好处: 变量可以根据需要从任何位置按顺序读取: 字符型变量可以读入中间含有空格的字符型数据;可以读取没有分隔符号但是格式整齐的数据;可以超过8个字符长度!

(3)定义变量时的数据格式

SAS变量的输入、输出格式的一般形式:[$]格式名<w>.<d>
$: 字符型格式的前缀;w:总宽度;d:数值型变量小数点后的位数


(4)定义变量属性语句即ATTRIB语句
[格式]

ATTRIB 变量名1 [FORMAT=格式] [INFORMAT=输入格式] [LABEL='标记内容'] [LENGHT=[$]长度]

             变量名2 [FORMAT=格式] [INFORMAT=输入格式] [LABEL='标记内容'] [LENGHT=[$]长度]

              ...;

Title ‘2015级学生名单’;
data stud;attrib id length=$9. label="学号"
name label="姓名"
gender label="性别"
age label="年龄"
hometown label="籍贯"length=$20.;input id$ name$ gender$ age hometown$;
cards;
201501001 周国兴  男   19   长沙
201501002 李铭    女   18   广西壮族自治区
;proc print data=stud; /*proc step */
run;

(5)赋值语句

[功能] 将<表达式>的值赋给左边的<变量>,可以对变量作变换和赋值,创建新变量,计算新数值以及控制条件语句的运行等。

[格式] <变量名>=<表达式>;

  • SAS表达式由一系列运算符和运算对象构成,被执行后产生一个目标值。
  • 运算对象包括常量、变量、SAS函数。
  • 运算符包括算术运算符、比较运算符、逻辑运算符、特殊运算符和括号。

SAS常量有:字符常量、数值常量和日期时间常量。
1)字符常量: 字符常量是由引号括起来的字符串,最多可达32767个字符。字符常量是区分大小写的,“TOM”和“tom”是不同的字符常量。
例如:‘123’ name=“TOM”; 

data class1;
set sashelp.class;
keep name sex age ;    /*字符变量后不带$*/
if sex=“女”;           * "女"表示字符常量;
run;

2)数值常量, 例如:1 -5 1.23 
3)日期、时间常量
日期/时间常量是将日期/时间由单引号括起来,并在后面加上 d(日期常量)或 t(时间常量)或 dt
(日期时间常量)。例如:’1jan2015’d ‘10:15’t ‘ 6Jun11:12:25’

4)算术运算符:+(加),-(减),*(乘),/ (除), **(乘方)

5)关系运算符:
①=, EQ equal to 等于
②^=, NQ not equal to 不等于
③>, GT great than 大于
④<, LT less than 小于
⑤>=, GE great than or equal to 大于或等于
⑥<=, LE less than or equal to 小于或等于

6)逻辑运算符:^ NOT 逻辑非、& AND 逻辑与、| OR 逻辑或

7)特殊运算符
①数值><数值  (MIN)  取最小值  eg:min=4><8 
②数值<>数值  (MAX) 取最大值
③||(Join)连接两个字符值
④IN属于  如:hometown in (‘北京’,’上海’,’武汉’)

(6)put语句

[功能] PUT语句将输出信息显示在LOG窗口。
[格式] PUT [@ 指定列] [变量] [$] [起始列-末列] [@];
其中, [@ 指定列] 将指针移到指定列
[@];指针保持在当前行

(7)SET语句

[功能] 1. 数据集的复制与修改 2. 拆分数据集 3. 纵向合并数据集

功能1、SET语句把一个已有数据集复制到一个新数据集,同时可以进行修改

[格式] 

DATA [<新数据集名1>];
SET <已有数据集名1>;

[keep/drop 变量名1 变量名2...]

[if/where等]

run;

data class1;
set sashelp.class;
keep name sex age ;/*字符变量后不要带$*/
if sex=“女”;
run;

功能2、拆分数据集,按某拆分条件,把一个已有数据集分别存放到不同的数据集

横向拆分:SET语句和OUTPUT语句

[格式]

DATA [<新数据集名1>][<新数据集名2>];
SET <已有数据集名1>;

if 条件 then output 新数据集名1;

if 条件 then output 新数据集名2;

run;

纵向拆分:SET语句和keep/drop语句

data 新数据集名 (keep/drop = 变量)
         新数据集名 (keep/drop = 变量);
set  原始数据集;
run;

data boy girl;
set sashelp.class;
if sex=“男” then output boy;
if sex=“女” then output girl;
run;data s1(keep=sex )s2(keep=name);
set sashelp.class;
run;

功能3、用set语句把几个结构相同的数据集上下地连接,形成一个新的数据集,新的数据集的观测数是原来几个数据集观测数的总和。

[格式]

DATA <新数据集名1>;
SET <已有数据集名1> <已有数据集名2>;

Data ALL;
Set boy girl;
Proc print data=ALL ;
Run;

延申:

单个数据集

方法一
data 新数据集名;
set  原始数据集(keep/drop = 变量);
run;
或者
data 新数据集名 (keep/drop = 变量);
set  原始数据集;
run;
方法二
data 新数据集名;
set 原始数据集名
keep/drop 变量;
run;

两者的差异:set是数据读入pdv的一个过程,方法一 数据读入程序数据向量PDV只读入keep后的变量,方法二 读取全部,方法一 还能获取多个数据集,推荐方法一

(8)MERGE语句:横向合并数据集(类似sql中的全连接)

[功能] 将两个或多个SAS数据集的观测横向匹配合并成一个新数据集的一个观测。

[格式]

DATA <新数据集名>;
MERGE <已有数据集列表> ;
BY <变量1>[<变量2>…];          *数据集的共同变量;
RUN;

??前提是需要排序吗?

(9)IF语句

[功能] 仅对符合条件的观测值进行处理;

[格式]

格式一:IF <条件或表达式>THEN <语句>;
                    [ ELSE <语句> ];
格式二:IF <条件或表达式>;

 (10)WHERE语句 -条件语句(比IF语句效率更高)

DATA步中的WHERE语句包含一些特殊的运算符,这些运算符只能用于WHERE表达式中
•Is missing | is NULL : 选择变量值为缺失值的所有观测;
•LIKE : 字符串比较运算符,可以使用通配符号:
“%”:表示任意字符串
“_”:表示任意单个字符
•BETWEEN m AND n: 选择变量值介于[m,n]间的观测。

data Li1 ;
set sashelp.class;
Where name like “_丽%”;
run;*where between and用法;
data test1;
set sashelp.airline;
WHERE AIR BETWEEN 100 AND 110;
run;

(11)select语句(类似case when)

格式一:
SELECT;
WHEN (条件) 语句;
WHEN(条件) 语句;
……
[ OTHERWISE 语句;]
END;
格式二:
SELECT (选择表达式);
WHEN(值列表) 语句;
WHEN(值列表) 语句;
……
OTHERWISE 语句;
END;

Data boy girl;
set sashelp.class;
select ;
when (sex=“男” ) output boy;
when (sex=“女” ) output girl;
otherwise put sex= '有错';
end;
Run;

(12)循环语句

DO循环的语法格式:
DO <计数变量>= <起始值> TO <结束值> [BY 步长];
循环体……;
END;

data hat;
do x=-5 to 5 by 0.25;
do y=-5 to 5 by 0.25;
z=sin(sqrt(x*x+y*y));output;
end;
end;
run;

(13)FILE语句

[功能] 定义一个外部文件作为当前的输出文件,以供PUT语句将数据输出到该文件中去
•File ‘全路径文件名’; /* 将PUT语句的输出写入指定文件*/
•File log; /* 指定把put语句的输出送到日志窗口*/
•File print; /* 把put语句的输出送到输出结果窗口*/

Data;
FILE “C:\SASDATA\RESULT.TXT”;
A=99;
PUT @10 A;
RUN;

小结:

Data步 建立数据集的两种方式:数据直接输入:INPUT,CARDS;数据来自外部文件:INFILE,INPUT

定义变量属性的语句:LABEL,LENGTH,FORMAT,INFORMAT,ATTRIB 定义日期时间的输入格式

赋值语句:常量、变量;运算符:算术、关系、逻辑、特殊;函数:字符串处理、数值计算、日期处理等

SET/MERGE语句:SET三个功能、OUTPUT语句、MERGE横向合并

其他Data步语句:IF分支选择、SELECT多分支、DO循环、WHERE条件、独有运算符、FILE语句、PUT语句

本文链接:https://my.lmcjl.com/post/11903.html

展开阅读全文

4 评论

留下您的评论.