SAS(八)DATA步

绝大部分的SAS语句都可分为两步:DATA步(打开、编辑、整理数据)和PROC步(分析、处理、显示数据)组成的,今天我们来学习DATA步相关知识点。

DATA步主要是运用到以下四个类型的语句:

  • 文件操作语句
  • 运行语句
  • 控制语句
  • 信息语句

在学习这种类型语句之前,先学习DATA步的流程

  • DATA语句标志了数据步开始,并指定了数据步结束时要生成的数据集名字。
  • 每次读入一行数据,读入后执行数据步中的其它语句,循环数据步读取整个数据。
  • _N_变量表示DATA步已经执行的次数
  • _error_变量值为1时表示程序出错
data flow;
file print;                                                                                                                             /*put x= y= z= _n_;*/                                                                                                                 input x y;                                                                                                                            z=x+y;                                                                                                                                put x= y= z=;                                                                                                                         put _n_= _error_=;                                                                                                                    cards;
10 20
100 200
1000 2000
;
run;                                                                                                                                    proc print data=flow;
title ' ';
run;

输出:

读外部数据时,数据步迭代(即每一次)的开始把变量的值置为缺失值,有几种情况例外:
1、retain语句提到的变量
2、sum语句中创建的变量
3、数组_temporary_中的数据元
4、file和infile语句选项中创建的变量
5、自动变量
读sas数据集时,只在第一次迭代时把变量值置为缺失,以后变量保留其值直至新值写入

文件操作语句

DATA语句

DATA语句的选项
DROP选项(不列出某些变量)
KEEP选项(列出某些变量)
LABEL选项(给数据集加标签)
RENAME选项(重命名变量)

首先这个是flow的数据集

data new1(drop=z);                                                                                                                      set flow;
run;
data new2(keep=x);                                                                                                                      set flow;
run;
data new3(label='the new3 dataset');                                                                                                    set flow;
run;
data new4(rename=(x=xx y=yy));                                                                                                          set flow;
run;
proc print data=new1;
run;
proc print data=new2;
run;
proc print data=new3;
run;
proc print data=new4;
run;

label可以在数据-右键属性看

数据集名字:
1、data语句后无数据集名字,则自动生成 data1, data2等为数据集名字,相当于data _data_;
2、data _null_;不产生实际的数据集,只是把内容暂存于内存,以供put语句等读取结果,可以节约计算机资源
3、data _last_;以最近产生的数据集命名并取代其内容。

Input语句

分组格式:
input  (g1-g5)  (3*7.2 , 2*5.2);

input  (a  b)  ( $5.)

input  (a  b)  ($ , 5.)

@@-无需分行而按变量连贯读数据

data;                                                                                                                                   input x @@;                                                                                                                           cards;                                                                                                                                 1 2 3 4                                                                                                                                ;                                                                                                                                      run;                                                                                                                                   proc print;                                                                                                                            run;                                                                                                                                   

@-固定该数据行;用于需要多个input语句同时读取一行数据。

data ;                                                                                                                                  input type $ @;                                                                                                                       if type='c' then input course $ prof $;                                                                                               else if type='s' then input name $ id 3.2;                                                                                            cards;                                                                                                                                c math zxs                                                                                                                            s zhao 58888                                                                                                                          ;                                                                                                                                     proc print;                                                                                                                           run;

利用@n   +n    #n 进行指针控制

data inputtest;                                                                                                                         input @1 x 5.2  @6 y 2.1 +2 z #2 xx;                                                                                                  cards;
12345678912345
234
;
proc print inputtest;
run;

个特殊符号的用法(: & ~)
:  读值时第一次遇到分隔符、或是数据行末尾、或是读满列数而结束
& 字符型输入值可以嵌有一个或几个空格
~  字符型输入值保留引号(与infile 语句中选项dsd一起使用才有效)


data topics9;                                                                                                                           infile datalines dsd;                                                                                                                 input speaker :$15. title ~$40. location & $10.;                                                                                      datalines;                                                                                                                            Whitfield,'Looking at Lift',Blue Room                                                                                                 Puentes,"Life After the Revolution",Red Room                                                                                          Townsend,"Peace in Our Times",Green Room                                                                                              ;                                                                                                                                     proc print data=topics9;                                                                                                              run;

Cards语句

  • Cards语句与datalines语句可以通用
  • 如果输入数据中含有分号,可用cards4语句或datalines4语句,同时,数据结尾用4个分号表示数据输入结束
data cardstest;                                                                                                                         input number citation $50.;                                                                                                          cards4;
1 Berry
2  LIN ET AL., 1995; BRADY, 1993
3  BERG, 1990; ROA, 1994; WILLIAMS, 1992
;;;;
run;
proc print data=cardstest;
run;

Put语句

  • Put语句负责在log窗口输出一些结果,file print选项可把输出转移到output窗口
  • Put _infile_  (输出最新的数据行到SAS log 窗口)
  • Put _all_  (输出所有变量的值)
  • Put _page_ (输出新页)
data;                                                                                                                                   /*file print;*/ /* change the output window*/                                                                                          put 1230*'SAS学习';                                                                                                                    run;                                                                                                                                   proc print ;                                                                                                                           run;

File语句

File print  把put语句产生的输出结果转移到output窗口

data;                                                                                                                                   file print;
/* change the output window*/                                                                                                           put 1230*'SAS学习';                                                                                                                    run;                                                                                                                                   proc print ;                                                                                                                           run;

By语句

  • 在DATA步中,SAS系统对每个BY组创建两个临时变量:
  • First .variable
  • Last .variable
  • 它们用来区别每个BY组的第一个和最后一个观测

Set语句

  • 使用set语句复制数据集
  • Point选项指明要读入的记录序号,set 数据集 point=指针变量;可用于抽样,一般与output语句连用
  • Nobs选项创建一个临时变量用来存储数据集的观测总数
data abc;                                                                                                                               set peixun.oranges;
run;
proc print;
run;

原数据集如下

data zxs;                                                                                                                               do n=2 to total;                                                                                                                      set sasuser.flow point=n nobs=total;                                                                                                  /*if _error_=1 then abort;*/                                                                                                          output;                                                                                                                               end;                                                                                                                                  stop;                                                                                                                                 run;
PROC PRINT data=zxs;
RUN;

结果输出:

  • Set语句可以串接多个数据集,形式如下

Data 数据集;

set 数据集A    数据集B   ……;

<by  变量;>

Run;

  • Rename选项负责改名;in选项产生变量负责记录观测来自该数据集;
data a;                                                                                                                                 input id ming $ sex $ @@;                                                                                                          cards;                                                                                                                         1 MARY F  3 ANN  F 4 TOM  M                                                                                                    ;
data b;                                                                                                                                 input id name $ sex $ @@;                                                                                                          cards;                                                                                                                             2 JOSE F 5 ERIE M  6 MAY F 1 MARY M
;
data  result;                                                                                                                           set a(rename=(ming=name)) b(in=inb);                                                                                              *by id;                                                                                                                       if inb=1 then bonus=100;
run;
proc  print;                                                                                                                            title'串接数据集';
run;

Merge语句

  • 使用Merge语句并接多个数据集,形式如下

Data 数据集;

merge 数据集1  数据集2   ……;

by 变量;

run;

data person;                                                                                                                            input name $ sex $;                                                                                                                cards;
MARY F
ANN  F
TOM  M                                                                                                                                  ;
data place;                                                                                                                             input name $ city $ region;                                                                                                        cards;
MARY MIAMI 2
ANN TAMPA 6
JOSE ERIE 5
MARY TAMPA 7
;
/*proc sort data=person;
by name;
proc sort data=place;
by name;*/
data  result;                                                                                                                           merge person place;                                                                                                               *by name;
proc  print;                                                                                                                            title'DATA SET RESULT';
run;

Update语句

  • Update语句用一个升级数据集中的观测来修改一个主数据集。
  • Update语句一定要与BY语句一起使用,BY语句给出了合并观测时共同变量的名字
  • 主数据集中的共同变量必须是单值的,即不能有两个或两个以上的观测其共同变量值相同
data a;                                                                                                                                 input id name $ sex $;                                                                                                             cards;                                                                                                                         1  zxs   m                                                                                                                     2  zjy   m                                                                                                                     3  zm    f
;
data b ;                                                                                                                                input id name $ sex $ sales;                                                                                                       cards;                                                                                                                         1   zxs   f  34
;
data c;                                                                                                                                 update a b;                                                                                                                        by id ;
run;
proc print data=c;
run;

Infile语句

  • Delimiter (DLM)选项:规定一个字符替代空格作为分隔符。
  • Firstobs选项 :不是从文件的第一个记录开始,而是从指定行开始读取记录
  • Obs选项:规定用户想从输入文件中连续读取的最后一个记录号
data new1;                                                                                                                              infile cards delimiter=',';                                                                                                           input x y z;                                                                                                                          cards;
1,2,3
4,5,6
;
data new2;                                                                                                                              infile cards dlm='ab';
input x y z;
cards;
1aa2ab3
4bb5ba6
7a8b9
;
run;
proc print data=new1;
run;
proc print data=new2;
run;

下面这个有点类似分列读取,第一列读取两个字符,第二列读取三个字符,剩余第三列

data abc;                                                                                                                               infile 'e:\SAS\data\数据处理\column.dat' firstobs=2 obs=3;                                                                            input a $9.;
run;
proc print;
run;
DSD选项:
1、使最外层引号括起的内容当成整个字符串输入,并去除最外层引号
2、默认分隔符为逗号
3、两个相邻的分隔符意味着前一个分隔符后的字段为缺失值
data;                                                                                                                                   infile cards dsd;                                                                                                                     input x:$15. y;                                                                                                                       cards;
"i'm a student",,
;
run;
proc print;
run;

  • 当行末尾数据宽度少于规定宽度时

Flowover: 默认选项,将下一条记录读入

Missover:将变量置为缺失

Truncover:将数据直接读入,不管宽度是否少于规定宽度

Stopover:系统终止数据步执行,报告出错

data;
infile 'e:\SAS\missover.dat';/*flowover missover truncover stopover pad*/
input x 5.;
run;
proc print;
run;

这是原始missover.dat的数据

输出结果:

SAS(八)SAS之DATA步--文件操作语句相关推荐

  1. python读取sas数据集_SAS之DATA步运行机制

    相信了解SAS软件的朋友都知道,SAS主要由DATA步和PROC步组成,其中DATA步作为数据读入.清洗.整理的主要程序步,学好DATA就显得尤为重要.而了解DATA步,重中之重就得了解PDV(Log ...

  2. VBA-基本的文件操作语句与文件加密(加密dog)

    1.基本的文件操作,如重命名,移动,删除,新建,文件大小,具体代码如下所示 Option Explicit  Sub 演示()   Dim strpath As String, filename As ...

  3. SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制...

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...

  4. 从程序员到数据科学家:SAS 编程基础 (06)- DATA步与PDV

    在BASE SAS 中,DATA 语句用于开始一个数据步, 后续为若干DATA步特定的语句:SAS数据步结束于下一个 DATA 步或 PROC 步开始之处,或者结束于后续显式指定的RUN语句. 注意: ...

  5. Chapter002[SAS DATA步之全解密-01]

    以下是个人对PDV的粗浅总结,希望各位高手补充指正. 什么是PDV 个人认为可以把PDV想象成一排用于存放变量值的盒子.每个盒子代表一个变量. 提交一个DATA步后,SAS会对这个DATA步进行编译, ...

  6. #SAS进阶-SAS宏介绍

    嗯,最近在学习宏真得有点难度,不过似乎现在大体系统了解了这块知识,所以,就今晚进行一个整理归纳~ 一.宏功能 1)可以降低重复性任务的工作量,便于重复调用. 2)使程序模块化,同时便于修改宏参数,而无 ...

  7. sas mysql乱码_SAS 数据步 常见错误汇总之1-上

    来自http://hi.baidu.com/רҵͳ��ʦ/blog/item/7dd299faf7b7ac1e6c22eb72.html SAS的DEBUG方面的内容比较少,现在我将网上的一些有关DE ...

  8. SAS EG ERROR:******引用越过文件结尾的页

    SAS EG ERROR:******引用越过文件结尾的页 引发错误的场景 项目需要引用前期项目已经生成的SAS数据集,所以从另一个项目中下载下来,要上传到SAS服务器. 但是多次上传都报这个错误,开 ...

  9. 【Java文件操作(八)】将控制台输出重定向到txt文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

最新文章

  1. Redis RDB 持久化详解
  2. it转正述职报告_普通员工转正述职报告范文
  3. RecyclerView 使用指南
  4. 华为全面屏鸿蒙,华为P50pro最新确认:麒麟1020+立体全面屏+鸿蒙系统,这才是华为...
  5. python的learn_Python_learn_1day
  6. Power BI for Office 365(八)共享查询
  7. C# 对get和set的理解
  8. java chain_java 8中 predicate chain的使用
  9. tm是什么域名_入驻天猫,需要什么条件?
  10. php更新数据步骤,Thinkphp5模型更新数据方法
  11. python linkedlist,LinkedList在python中的实现
  12. Android IPC(三)AIDL实现跨进程通信
  13. CentOS 7 安装 Weadmin(ITOSS)
  14. GF1_WFV(高分一号宽幅)GF6_WFV(高分六号宽幅)GF4(高分四号)CB04(中巴04星)免费下载方式简介
  15. flash player官网地址 建议不要下载flash.cn的
  16. 乐视网正式聘用刘延峰担任公司总经理 任期三年
  17. Android 解决程序启动时的黑屏问题
  18. DeFi明斯基时刻:压力测试与启示
  19. [SV]SystemVerilog学习笔记之struct union
  20. cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…

热门文章

  1. 服务器多系统ssd寿命检测,SSD是什么?寿命如何?
  2. obsidian之快速拆分文件的插件note-refactor操作手册
  3. 双网卡共享上网详细设置图解教程(
  4. JVM第四篇之益处、常用java工具
  5. 正则表达式验证邮箱格式
  6. naarray查询 swift_VLOOKUP查询时为什么会出现NA?原来知道这6种解决方法这么重要...
  7. Linux学习-----Chapter six
  8. mac装机系列:每次打开iTerm都需要source bash_profile问题
  9. 关于Latex中生僻字显示问题
  10. IDF实验室 聪明的小羊