本篇基于上一篇的理论学习,即SAS入门(一)进行实战,旨在记录实操中的语句及练习中出现的bug、解决方案。

循环语句

  • DO Index 语法

DO indexvariable= initialvalue to finalvalue ;
. . . SAS statements . . . ;
END;

  • 例子

DATA ex1;
SUM=0;
DO VAR=1 to 5;
SUM=SUM+VAR;
END;
PROC PRINT DATA=ex1;
RUN;

  • DO While 语法

DO WHILE (variable condition);
. . . SAS statements . . . ;
END;

  • 例子

data ex2;
sum=0;
var=1;
do while(var<6);
sum = sum+var;
var=var+1;
end;
proc print;
run;

  • DO Until 语法

DO UNTIl (variable condition);
. . . SAS statements . . . ;
END;

  • 例子

data ex3;
sum=0;
var=1;
do until(var>5);
sum=sum+var;
var+1;
end;
proc print;
run;

**注:**上述语句块结束后均要加end

IF语句

  • if语句 语法

IF (condition );

if语句筛选符合条件的数据时,首先要通过set引用已存在的数据集,此后创建新的数据集并通过if 筛选符合条件的数据,最后通过proc print输出。

  • 例子

DATA dat;
INPUT EMPID ENAME $ SALARY DEPT $ DOJ DATE9.;
LABEL ID = ‘Employee ID’;
FORMAT DOJ DATE9.;
DATALINES;
1 Rick 623.3 IT 02APR2001
2 Dan 515.2 OPS 11JUL2012
3 Mike 611.5 IT 21OCT2000
4 Ryan 729.1 HR 30JUL2012
5 Gary 843.2 FIN 06AUG2000
6 Tusar 578.6 IT 01MAR2009
7 Pranab 632.8 OPS 16AUG1998
8 Rasmi 722.5 FIN 13SEP2014
;
Data EMPDAT1;
Set dat;
IF SALARY > 650; /* if后面加不加括号均可运行 */
PROC PRINT DATA=EMPDAT1;
run;

  • if - then - else - if 语句 语法

IF (condition1) THEN result1;
ELSE IF (condition2) THEN result2;
ELSE IF (condition3) THEN result3;

  • 例子

data dat2;
set dat;
if salary<600 then range=‘low’;
else if 600<= salary <700 then range=‘medium’;
else if salary>700 then range=‘high’ ;
proc print;
run;

  • if - then dalete 语句 语法
    删除符合条件的列

IF (condition ) THEN DELETE;

  • 例子

data dat1;
set dat;
if salary>700 then delete;
proc print;
run;

宏变量

全局宏变量

在SAS环境中的任何程序中均可调用,通过&调用

proc print data=dat;
where dept=‘IT’ ;
title “info of &SYSDAY &SYSDATE” ;
/* 必须用双引号,title后没有=*/
run;

局部宏变量

自定义局部宏变量

  • 语法

% LET (Macro Variable Name) = Value;
/* 通过 %let 定义*/

  • 例子

%let dept_=‘IT’;
proc print data=dat;
where dept = &dept_;
title “info of &sysday &sysdate” ;
run;

定义宏程序

  • 语法

/* Creating a Macro program. /
%MACRO (Param1, Param2,….Paramn);
Macro Statements;
%MEND;
/
Calling a Macro program. */
%MacroName (Value1, Value2,……Valuen);

  • 例子

%macro result(name_) ;
proc print data=dat;
where dept="&name_";
title “info of &sysday”;
run;
%mend;
%result(IT);

注:
1、where语句中的变量名引用必须是双引号
2、引用宏时,括号内的参数区分大小写(一定要与实际数值相匹配);

数据集操作

数据导入

1、通过import导入.xls数据集时报错:

ERROR: Database error. Examine fields and/or messages below.
Unexpected OLE2 file manipulation error (-2147287038).

问题溯源:
找到一篇文章,提示xls文件导入报错是由于版本不适配
SAS 入门(二)实战篇
2、通过data步自主创建
版本问题不好解决且训练集比较小的情况下,决定通过data步创建,代码格式:
注:此处创建永久的数据集

Libname ex ‘c:\SAS\dataset’ ; /* 创建永久数据库*/
Data ex.GDP;
Input year gdp1 gdp2 gdp3 @@; /* @@表示 连续输入*/
cards;
1978 28.18857 47.87643 23.935
1979 31.26565 47.10062 21.63373
1980 30.17392 48.2222 21.60387
1981 31.88069 46.11002 22.00929
1982 33.38876 44.76504 21.84621
1983 33.17966 44.37958 22.44076
1984 32.13198 43.08654 24.78148
1985 28.44262 42.88581 28.67157
1986 27.15007 43.72381 29.13612
1987 26.81105 43.55061 29.63835
1988 25.69572 43.78965 30.51462
1989 25.10501 42.83112 32.06388
1990 27.11618 41.34065 31.5531
1991 24.52632 41.78868 33.68501
1992 21.78991 43.44464 34.75545
1993 19.70843 46.56837 33.7232
1994 19.76125 46.56929 33.56947
;

之前未加@@时发生报错;
注:@与@@区别

  • @ 表示执行下一个操作时,指针移到下一个记录。
    如:

cards;
1 2
3 4 ;

  • @@表示执行下一个操作,指针保持在当前记录。
    如:

cards;
1 2 3 4;

3、数据打印
proc步的print函数

proc print data=ex.gdp;
run;

输出结果如下:
SAS 入门(二)实战篇
4、input定义变量
SAS语法参考链接

变量类型 定义方式 备注
字符型 INPUT FNAME $ LNAME $ ADDRESS $; 在变量名后添加符号 $
日期型 INPUT VAR1 DATE11. VAR2 MMDDYY10. ; 在变量名称末尾添加带有空格的日期格式
数值型 Varname Formatnamew.d VARNAME是变量的名称;FORMATNAME是应用于变量的数字格式的名称;w是允许为变量存储的数据列的最大数量(包括小数点后的数字和小数点本身);d是小数右边的位数;

注:
1、 input @1 COL1 4.2 @7 COL2 3.1; /* @x 表示从第x位开始读;n.p表示共计n位,小数点后有p位 */

2、日期格式

输入日期 日期宽度 format
03/11/2014 10 mmddyy10.
03/11/14 8 mmddyy8.
December 11, 2012 20 worddate20.
14mar2011 9 date9.
14-mar-2011 11 date11.
14-mar-2011 15 anydtdte15.
  • 例子

DATA TEMP;
/* 定义输入时的数据格式*/
INPUT @1 DOJ1 mmddyy10. @12 DOJ2 mmddyy10. ;
/* 定义输出的数据格式,若不定义则默认输出为数值*/
format DOJ1 date11. DOJ2 worddate20. ;
DATALINES;
01/12/2012 02/11/1998
;
PROC PRINT DATA=TEMP;
RUN;

子集数据

  • 通过drop去掉一些指标
  • 通过keep保留一些指标

KEEP var1 var2 … ;
DROP var1 var2 … ;

例子:

DATALINES;
1 Rick 623.3 IT
2 Dan 515.2 OPS
3 Mike 611.5 IT
4 Ryan 729.1 HR
5 Gary 843.25 FIN
6 Tusar 578.6 IT
7 Pranab 632.8 OPS
8 Rasmi 722.5 FIN
;
/* 第一种情况*/
RUN;
DATA OnlyDept;
SET Employee;
KEEP ename DEPT;
RUN;
PROC PRINT DATA=OnlyDept;
RUN;
/* 第二种情况*/
DATA OnlyDept;
SET Employee;
DROP empid salary;
RUN;
PROC PRINT DATA=OnlyDept;
RUN;

  • IF语句选定指标

IF Var Condition THEN DELETE ;

例子

DATA OnlyDept;
SET Employee;
IF salary < 700 THEN DELETE;
RUN;
PROC PRINT DATA=OnlyDept;
RUN;

相关文章:

  • 2021-04-19
  • 2021-12-09
  • 2021-05-14
  • 2022-12-23
  • 2021-12-02
猜你喜欢
  • 2022-01-19
  • 2021-06-22
  • 2021-12-02
  • 2021-10-02
  • 2021-06-06
相关资源
相似解决方案