SAS笔记3——数据集操作

 

第六章  修改SAS数据集

6.1SET

修改数据,纵向合并

语法子项说明
data-set-optionsKEEP/DROP=变量指定变量进入/不进入PDV
 RENAME=表达式更换指定变量在PDV中的名字
 WHERE=表达式执行PDV之前满足表达式
 IN=变量创建一组标识变量,若当前数据属于某数据集则为1,反之为0
 FIRSTOBS=常数N从第N个数开始读取
 OBS=常数N读到的最后一个观测是第N个数
optionsNOBS=变量把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

 

 

 

转载于:https://my.oschina.net/u/3744769/blog/1609266

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值