第六章 修改SAS数据集
6.1SET
修改数据,纵向合并
语法 | 子项 | 说明 |
---|---|---|
data-set-options | KEEP/DROP=变量 | 指定变量进入/不进入PDV |
RENAME=表达式 | 更换指定变量在PDV中的名字 | |
WHERE=表达式 | 执行PDV之前满足表达式 | |
IN=变量 | 创建一组标识变量,若当前数据属于某数据集则为1,反之为0 | |
FIRSTOBS=常数N | 从第N个数开始读取 | |
OBS=常数N | 读到的最后一个观测是第N个数 | |
options | NOBS=变量 | 把SET语句后所有数据的总观测值赋给变量 |
POINT=变量 | ||
END=变量 | 每一个SET语句后数据文件的结束标识 | |
KEY=索引名 | 创建新自动变量_IORC_,显示最近的I/O序列号。如果没找到则返回_ERROR_=1 |
DATA rename;
SET sashelp.class(keep=name sex rename=(name=name_new sex=sex_new);
RUN;
DATA where;
set sashelp.class(keep=sex where=(sex='M');
RUN;
1、point = N:选取指定观测
注意:同NOBS一样,point后面跟变量而不是常数;
point往往和stop连用来阻止DATA步执行
point和nobs是相互独立的,在任何一个DAT步中,nobs总是先于PDV执行,point是在PDV之后执行。
data nobs_point;
set sashelp.class nobs = last point = last;
output;
stop;
run;
2、SET/SET语句
set a; set b;先读取数据集a里的第一个数据,再读取数据集b里的第一个数据;再读取数据集a里的第二个数据,b里的第二个数据……(当两个数据集观测个数不相等时,第一个数据集的观测读取完时,程序停止)
6.2BY
6.3MERGE
DATA new-data-set;
MERGE data-set1 data-set2;
BY variable-list; /*注意如果两个数据集有重叠的变量——除了BY变量,那么第二个数据集中的此变量会覆盖第一个数据集中的。 */
如果是一对多的数据合并,则一对多的一要放在前面
6.4UPDATE语句
UPDATE master-data-set<data-set-options> transaction-data-set<data-set-options> <END=variable><UPDATE=MISSINGCHECK|NOMISSINGCHECK>;
BY by-variable;
说明:1、UPDATE语句一定要和by语句连用,这个By语句给出了主数据集合更新数据集共同变量的名字。
2、UPDATA使用的数据集必须事先按照by语句指定变量排序,或已有合适索引。
3、一般情况下,由By语句指定的变量在主数据集中的观测值最好是唯一的,若有多个观测值相等,update只更新第一个观测值。
4、对更新数据集存在缺失值的处理是通过开关选项UPDATEMODE来完成的。
默认为UPDATEMODE=Missingcheck,检查修改数据集,若有缺失值,则保留主数据集中相应数据。UPDATE=Nomissingcheck,若有缺失值,则将主数据集中的相应数据更新为缺失。
proc sort data=chp3.merge_a;by x;run;
proc sort data=chp3.merge_b;by bx;run;
data test;
update chp3.merge_a(in=a) chp3.merge_b(rename=(bx=x) in=b);
by x;
run;
6.5MODIFY语句
1、访问方式
(1)匹配访问。DATA master_data; modify master_data transaction_data;......;by variable;RUN;
匹配访问以by变量为主数据集和更新数据集共同的标志变量。在PDV机制上,MODIFY会要求内存开辟两条PDV,分别对应主数据集master_data和更新数据集transaction_data,MODIFY读入更新数据集的观测后,系统启动动态WHERE语句查询主数据集对应的观测,然后进行更新.
(2)索引访问。DATA master_data; set transaction_data;
modify master_data key=variable</unique>;......;RUN;
索引访问指定KEY=为主数据集被索引变量,然后由该变量连接SET语句后更新数据集对应观测。如果更新数据集在主数据集中没有找到主数据集KEY=对应的变量值,系统会设置自动变量_ERROR_值为1
(3)观测序号访问。DATA master_data; set transaction_data;
modify master_data point=variable;......;RUN;
(4)顺序访问。DATA master_data; modify master_data <nobs=variable end=variable>;......;RUN;
2、输出方式
(1)没有规定任何输出语句——SAS系统默认为REPLACE,输出PDV当前观测到主数据集原先的位置。
(2)OUTPUT语句——当OUTPUT语句没有指定任何数据集名称时,会把当前观测输出到DATA部后面的所有数据集的末尾;当规定数据集名称时,把PDV当前观测输出到OUTPUT规定的数据集末尾。
(3)REMOVE语句——当PDV输出当前观测到主数据原先位置后,REMOVE语句删除该观测,这个观测的删除可以是物理上的,也可以是逻辑上的。REMOVE语句只能在MODIFY语句中使用。
3、关于自动变量_IORC_
当运行MODIFY语句时,一个名为_iorc_的自动变量被系统创建。_IORC_自动变量包含系统每次运行modify语句时返回的I/O操作码。以匹配访问为例,如果更新数据集BY变量值在主数据集中不存在,自动变量_IORC_返回一个非零值。
6.6合并统计量与原始数据
当想比较每一个观测值和一组变量的均值时,可以先使用proc means计算统计量,并保存输出文件,再与原始文件合并。例如,
DATA shoes;
INFILE 'c:\MyRawData\Shoesales.dat';
INPUT Style $ 1-15 ExerciseType $ Sales;
*Output grand total of sales to a data set and print;
PROC MEANS NOPRINT DATA = shoes;
VAR Sales;
OUTPUT OUT = summarydata SUM(Sales) = GrandTotal;
PROC PRINT DATA = summarydata;
TITLE 'Summary Data Set';
*Combine the grand total with the original data;
DATA shoessummary;
IF _N_ = 1 THEN SET summarydata;
SET shoes;
Percent = Sales / GrandTotal * 100;
PROC PRINT DATA = shoesummary;
VAR Style ExerciseType Sales GrandTotal Percent;
TITLE 'Overall Sales Share';
RUN;
6.7PUT语句
PUT语句可以输出变量信息到指定地点,包括:输出到SAS系统的日志窗口;输出到FILE语句规定的外部文件;输出到SAS系统的OUTPUT窗口。
列指针:+n/@n;行指针:/下一行,#n第n行.
单尾符@:一个数据行用多个PUT语句输出数据;或者用多个INPUT语句输入数据。
双尾府@@:一个输入数据行含有多个观测值,用INPUT语句读入;或则把多个观测值输出到一个数据行,用PUT语句输出。
#PUT语句实例;
data a;
input x $ y z @@;
cards;
a 10 20 b 30 40 c 50 60
;
run;
#简单方式;
data _null_;
set a;
put x$ @; put y @; put z;
run;
#列方式输出,带小数点;
data _null_;
set a;
put x$ 10-14 @; put y 15-20 .3 @; put z 25-30 .2;
run;
#列表方式输出,最大特点是可以用冒号去掉输出值之间多余空格;
data _null_;
set a;
put x$:@; put y:4.3 @; put z:7.4 @; put 3*'here is char';
/* n* 规定字符串被重复N次;*/
run;
/*格式化输出;
最大特点是可以自定义格式化列表如(4.2"--"2.)。而格式化列表必须和变量列表连用*/
data _null_;
set a;
put x$ 5-10; put @15 (y z) (4.2"--"2.);
run;
#等价于;
data _null_;
set a;
put x$ 5-10 @;put @15 y 4.3 @;put "--" @;put z 2.;
run;
#命名方式输出;
data _null_;
set a;
put x= @; put @15 y=4.3 @; put @25 z=2.;
run;
6.8FILE语句
FILE语句用于规定当前输出文件,并且该文件是一个不同于SAS文件的外部文件。FILE语句一般与PUT语句配合使用,同一个DATA步可以使用多个FILE语句。
格式为:FILE file-specification <option> <host-option>;
#file statement;
#filename指定一个输出路径和文件名;
filename file 'C:\Users\lei\Desktop\study\SAS\Book_data\utf.txt';
# SET语句读入一个SAS数据集,用PUT语句输出该数据集中的两个变量name和weight到utf.txt;
data _null_;
set sashelp.class;
file file encoding='utf-8';
put name weight;
run;
filename files 'C:\Users\lei\Desktop\study\SAS\Book_data\filename.txt';
data a;
length temp $50;
file files filename=temp;
put 'abc';
fname=temp;
run;
/*输出一个filename.txt,内容为abc;
生成一个数据集a,变量为fname,值为filename(路径名)*/
6.9INFILE