sas sql 读取最后一行数据_SAS基础编程和数据处理

d8f3693bf81cc9e8062cadf384598379.png

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路,接下来会继续讲统计基础以及在SAS软件内的应用,在这之前,本文先进行SAS基础使用编程的基础介绍,后续会主要阐述SAS软件内的统计数学的应用,如分析或初步建模等,当然了,也先推荐大家有关统计学和SAS学习的书籍:统计学的两本书,分别是《深入浅出统计学》和《商务与经济统计学》,关于SAS的书籍《深入解析SAS——数据处理、分析优化与商业应用》,大家看完之后,会有一个初步的认识。

本文主要介绍SAS编程和数据处理,会分为几个部分。

一 读取外部数到SAS数据集

1,通过使用libname..语句为一个SAS逻辑库分配引用名(临时逻辑库WORK除外),但逻辑库名不能超过8个字符,必须以字母或下划线开头,其余字符必须是字母,数字或者下划线:例如,下面的SAS语句定义了一逻辑库,引用名为saslib

libname saslib 'C:sasdata';

2,SAS变量属性包括变量名,类型,长度,输出格式(format),输入格式(informat)和标签,其中类型分为字符型和数字型,录入,下面的SAS语句定义一部分变量

data saslib.sales;

input ID $ Dept $ Sales Date;

format Sales comma10. Date yymmdd10.;

informat Date date9.;

label ID=”员工ID” Dept=“部门” Sales=“销售数据”;

label Date=“销售时间”;

datalines;

上述代码就定义了变量名以及对应的类型,长度,输出或输入格式。

3.查看数据集的描述信息内容,如数据集属性内容,仍以saslib.sales为例

Proc contents data=saslib.sales;

run;

就可以看到上述定义的变量名以及对应的类型,长度,输出或输入格式。

二 对单个数据集的处理

1,keep或drop选取部分变量:data步可以通过读取原数据集的部分变量来建立新数据集,仍以saslib.sales,读取变量ID和Sales,并建立新的数据集sales1,代码如下:

data saslib.sales1;

set saslib.sales(keep=ID Sales);

run;

proc print data= saslib.sales1;

run;

新的数据集只有两个变量:ID和Sales,我们也可以用drop语句,指定drop=ID和Sales之外的其他变量,结果是一样的

2,操作数据集的观测

1)if—then语句:SAS内的条件语句,与SQL或者Excel的使用方法类似,直接举例如下:if x<y then c=5;

else c=12;

2)if 条件表达式 then delete:使用delete语句删除满足条件的观测,举例如下:

仍然是saslib.sales数据集,寻找销售数据(Sales)不为缺失值的观测并建立新的数据集saslib.sales2,代码如下:

data saslib.sales2;

set saslib.sales;

if Sales=” ” then delete;

run;

proc print data= saslib.sales2;

run;

上述代码就可以求出销售数据(Sales)不为缺失值数据集,也可以求出其他不为某些条件的数据集,只需把if内的条件表达式进行更改即可,举例如下:在saslib.sales数据集中,选取ID>10的观测输出到数据集saslib.sales1,并将销售数据(Sales)>100的观测输出到数据集saslib.sales2,代码如下:

data saslib.sales1

saslib.sales2;

set saslib.sales;

if ID>10 then output saslib.sales1;

if Sales>100 then output saslib.sales2;

run;

proc print data= saslib.sales1;

run;

proc print data= saslib.sales2;

run;

3)if—then的赋值语句:仍然以数据集saslib.sales为例,当ID=8时,Sales提高20%,

ID=10时,Sales提高10%,其他情况,Sales都提高5%,并生成新的数据集saslib.sales3下面有几种写法,得出的结果是一致的,代码如下:

data saslib.sales3;

set saslib.sales;

if ID=8 then Sales= Sales*1.2 ;

else if ID=10 then Sales= Sales*1.1;

else Sales= Sales*1.05;

run;

proc print data= saslib.sales3;

run;

第二种写法:

data saslib.sales3;

set saslib.sales;

select (Sales)

when(8) Sales= Sales*1.2;

when(10) Sales= Sales*1.1;

otherwise Sales= Sales*1.05

run;

proc print data= saslib.sales3;

run;

以上两种的结果是一样的。

3 分组与排序

1)sort by过程排序:要求数据集结果内的观测按照by语句中的变量进行升序或降序排列,仍然以数据集saslib.sales为例,要求输出的数据集saslib.sales4按照Sales进行降序排列,代码如下:

Proc sort data=saslib.sales out= saslib.sales4;

by descending Sales;

run;

2)找到分组的第一个和最后一个观测:仍然以数据集saslib.sales为例,取每组ID内最高和最低的Sales,生成新的数据集saslib.sales2,代码如下:

data saslib.sales2;

set saslib.sales;

by ID;

if first.ID or last.ID;

run;

4,循环和数组

1)迭代do语句:基本形式为

do 索引变量=开始值< to 结束值><by 递进值><while (表达式)><until(表达式)>;

SAS语句;

End;

举例如下:使用do循环生成数据集do1,数据集包含变量x和y,x的值为1、3、5,y为x的平方。代码如下:

Data work.do1;

do x=1 to 5 by 2;

y=x**2;

output;

end;

run;

2)do until语句:重复执行do循环的语句,直到条件为真。基本形式如下

do until (表达式);

SAS语句;

end;

举例如下:将给定字符串中包含的各个单词分开写入数据集中

data work.all;

length word $20;

drop string;

string=”the quick brown fox jumps over the lazy dog”;

do until(lengthn(word)=0);

count+1;

word=scan(string,count);

output;

end;

结果如下:

6c35d2f74d5fd667107ea180fc808c37.png

三 对多个数据集的处理

1,数据集的纵向串联

1)set语句纵向串联:基本形式如下

Data 新数据集;

set 数据集1 数据集2………;

Run;

举例如下,对数据集work.New1和work.New1进行纵向串联,生成新的数据集work.New12,代码如下:

data work.New1;

input Emp_ID $ Emp_Name $ @@;

datalines;

ET001 Jimmy ED003 Emy EC002 Alfred EQ004 Kim

;

run;

data work.New2;

input Emp_ID $ Emp_Name $ @@;

datalines;

EQ122 Molly ET121 Dillon ET124 Helen ED123 John

;

run;

data work.New12;

set work.New1 work.New2;

run;

proc print data=work.New1;

run;

proc print data=work.New2;

run;

proc print data=work.New12;

run;

结果如下:

e642dfb88f92495bb7ced1e812af0ec2.png

2)by 语句穿插串联:所有舒服数据集先按照by变量排序,新的数据集也将按照该排序,基本形式如下:

Data 新数据集;

set 数据集1 数据集2………;

by 变量1 变量2…………;

Run;

2,merge by数据集的横向合并:使用by语句,也称为匹配合并,注意在使用by语句时,输入数据集必须按照by变量排序。这个点就不举例子了,和上篇文章内的SQL类似。

3,数据集的更改

modify语句进行单个数据集的更改:运用该语句可以更改原数据集中的变量,但是不能再原数据集中添加或者更改,举例如下:数据集work.inventory中包含产品,库存和价格的信息,先决定将每个产品的价格提高15%,代码如下:

data work.inventory;

modify work.inventory;

price=price*1.15;

run;

proc print data=work.inventory noobs;

run;

前后代码结果为:

00962bdf1e5b0282396d21ce1fb91138.png

4,使用自动变量first.与last.:data步如果使用了by语句,会自动生成两个数值型自动变量first.与last.变量,分别用来辨识by组合的第一条和最后一条观测,举例如下:

数据集Sales中包含了每位员工的销售额和员工所属部门以及性别数据,统计各部门男员工和女员工的总销售额,代码如下:

首先将数据集Sales按照Dept和Gender排序,在运用first.与last.变量计算:

proc sort data=work.sales;

by Dept Gender;

run;

data work.sales_dept;

set work.sales;

by Dept Gender;

retain sales_by_dept;

if first.Gender then

sales_by_dept=0;

sales_by_dept=sales_by_dept+sales;

if last.Gender;

keep Dept Gender sales_by_dept;

run;

proc print data=work.sales_dept noobs;

title 'Sales by Department by Gender';

run;

前后图表如下:

9268d20f19766952c53de78ef203f379.png

5,使用hash对象处理多个数据集:基本形式如下:

Declare object hash 对象名(<主题1:内容1 <,主题2:内容2,…………>>);

Hash 对象名.definekey(<主题1:内容1 <,主题2:内容2,…………>>);

Hash 对象名.definedata(<主题1:内容1 <,主题2:内容2,…………>>)

Hash 对象名. Definedone()

第一行定义hash的对象名称,第二行和第三行分别定义了对象的key变量和data变量,第四行表示hash对象定义结束。下面举例说明:

公司现有库存1000台汽车,每台车可以发往各个仓库,但是不同仓库给公司带来的边际收益不同,而且每个仓库有一定的容量限制,现在求每个仓库发多少车,同时公司的效益最高,下面是仓库收益数据集expected_profit和仓库容量数据集warehouse_constraint部分数据如下图:

a3cf255f251f86818d4c360cc873e1ae.png

代码如下:data work.allocation;

retain total_cars_before 1000;

length warehouse_id $6;

if _N_=1 then

do;

declare hash constraint(dataset: "work.warehouse_constraint");

constraint.definekey('warehouse_id');

constraint.definedata('capacity');

constraint.definedone();

call missing(warehouse_id,capacity);

end;

set work.expected_profit;

rc = constraint.find();

if rc = 0 and capacity>=1 and total_cars_before>=1 then

do;

capacity=capacity-1;

total_cars_after=total_cars_before-1;

rc=constraint.replace(key:warehouse_id, data: capacity);

if rc=0 then

do;

output work.allocation;

total_cars_before=total_cars_before-1;

end;

else put "Error: Replace capacity failed!";

end;

else if rc ne 0 then

put "Error: Failed to find warehouse capacity!";

keep warehouse_id capacity profit_margin total_cars_before total_cars_after;

run;

结果如下:

44bf8578a24f27ad2e8b4c84ac008ae7.png

至此,SAS基本的编程就说完了,后续会进行SAS的统计与初步建模探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码合并工具_分享几款比较常用的代码比较工具

俗话说&#xff1a;三句不离本行&#xff0c;对于程序员这个可爱的群体来说也是一样&#xff0c;即使面对无休无止的编程工作&#xff0c;程序员们依旧任劳任怨的埋头苦干&#xff0c;梦想着用自己码下的代码改变世界。工欲善其事,必先利其器&#xff0c;每一位程序员都有自己私…

循环控制

循环控制 定义 Python 循环语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 并在符合条件的情况下跳出该段循环。 类似于控制语句。 如下图所示。 WHILE 循环 while 判断条件&#xff1a; 语句 求1~100的和 n 0 sum 0 while…

rest风格的get加密字符串怎么接收_RESTful Api的设计与风格,你该学一下咯

REST的重要概念REST全称是Representational State Transfer&#xff0c;中文意思是表征性状态转移。RESTful是指具有REST表征的web架构风格&#xff0c;并非必须遵守的规则。REST分离了API的结构和逻辑&#xff0c;主要应用于客户端和服务器交互类的软件。基于这种风格设计的软…

接口批量同步数据_千手接口平台+电商ERP,助德嵘大药房征战拼多多

拼多多对C端经营者来说&#xff0c;是一个处于红利期的第三方C端电商平台&#xff0c;进驻费比天猫低很多&#xff0c;而且流量成本也低&#xff0c;很多商家都跃跃欲试。但对于没有C端平台运营经验的商家&#xff0c;进驻后会发现几个"坑"&#xff1a;客单价低、退货…

php 接口有几种,【后端开辟】php接口有哪些范例?

接口是什么&#xff1f;运用接口(interface)&#xff0c;能够指定某个类必需完成哪些要领&#xff0c;但不须要定义这些要领的具体内容。接口是经由过程 interface 关键字来定义的&#xff0c;就像定义一个规范的类一样&#xff0c;但个中定义一切的要领都是空的。接口中定义的…

java是编译型语言还是解释型语言?

首先拿python和C说明&#xff0c;python运行速度慢&#xff0c;和C程序相比非常慢&#xff0c;因为Python是解释型语言&#xff0c;你的代码在执行时会一行一行地被python解释器翻译成CPU能理解的机器码&#xff0c;这个翻译过程非常耗时&#xff0c;所以很慢。而C/C程序是编译…

typedef函数指针_C语言函数指针之回调函数

1 什么是回调函数&#xff1f;首先什么是“回调”呢&#xff1f;我的理解是&#xff1a;把一段可执行的代码像参数传递那样传给其他代码&#xff0c;而这段代码会在某个时刻被调用执行&#xff0c;这就叫做回调。如果代码立即被执行就称为同步回调&#xff0c;如果过后再执行&a…

fedora 安装oracle 12c,Fedora 12下安装Oracle 11客户端

目标&#xff1a;将oracle-client(v11)安装到rdquo;/opt/oracle/rdquo;下准备好如下三个安装包&#xff0c;放在某个目录下&#xff0c;如&#xff1a;/root/software/ora目标&#xff1a;将Oracle-client(v11)安装到”/opt/oracle/”下准备好如下三个安装包&#xff0c;放在某…

轨迹跟踪主要方法_DELMIA教程:基于指令形式的机器人TCP轨迹局部跟踪方法

上一期为大家介绍了基于工具条中的“TCP Trace”命令按钮的全局TCP轨迹跟踪&#xff0c;之所以称之为全局轨迹跟踪&#xff0c;是因为只要命令被打开&#xff0c;机器人运行的全部轨迹都将实现跟踪。既然有全局TCP轨迹跟踪&#xff0c;那么就一定有局部TCP轨迹跟踪&#xff0c;…

[转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.htmlliamjeal电梯直达1# 发表于 2012-9-10 13:41:43 | 只看该作者 |只看大图 因CooCox用户数及影响力越来越大&#xff0c;CooCox团队也逐渐提高了对软件及代码协议的重…

qt 定时器累加值_零基础入门单片机定时器详解

一、基本定时器介绍在STM32中&#xff0c;基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元&#xff0c;提供16位的计数&#xff0c;能计数0~65535。基本定时器除了计数功能以外&#xff0c;还能输出给DAC模块一个TRGO信号。基本定时器框图如下&#xff1a;二、时基单元介…

jvm 安装位置_简单了解JVM

1、JVM的位置&#xff1a;JVM是在操作系统上面的应用软件JVM虚拟机有三种如下&#xff1a;① Sun公司的HotSpot&#xff1b;    ② BEA公司的JRockit&#xff1b;    ③ IBM公司的J9 JVM&#xff1b;java虚拟机属于第一种&#xff1a;2、JVM的体系结构&#xff1a;3、类…

前端安全之 XSS攻击

参看&#xff1a; XSS的原理分析与解剖 前端安全 -- XSS攻击 web大前端开发中一些常见的安全性问题 1、前言 XSS 是面试时&#xff0c;hr提出来给我的&#xff0c;然后大体的浏览一遍&#xff0c;今天才查阅资料大体了解了它。 XSS 攻击&#xff1a;攻击者向HTML页面传入恶意的…

图片

转载于:https://www.cnblogs.com/water-1/p/11138418.html

idea 调节背景护眼_夜间用电脑亮瞎眼睛?这份夜间护眼指南来帮你。

题图&#xff1a;来自 Unsplash文/彭宏豪&#xff0c;笔名/安哥拉不知从什么时候起&#xff0c;「头秃」成了网友和周围人口中的一个高频词汇&#xff0c;似乎很多事情都离不了头秃——学到头秃、工作到头秃、熬夜到头秃等等&#xff0c;就连「突然」也渐渐演变成「秃然」。但对…

编写有效用例电子版_剖析用例设计方法的使用

今天给大家讲解的是用例设计方法的使用&#xff0c;在设计用例时该如何应用用例设计方法、设计出覆盖率高的测试用例呢&#xff1f;场景简介&#xff1a;普遍登录页面测试用例设计分析拿到需求&#xff0c;首先要做需求分析。我们看到登录界面有三个测试点&#xff1a;1.账号2.…

一个参数大小写引发的uploadify报错 Syntax error, unrecognized expression: #

上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2 报错原因&#xff1a;参数ID【hidInfoId】小写错写成了大写。debug过程&#xff1a; ①&#xff1a;报错 "Syntax error, unrecognized expression: #" ②&#xf…

linux7 dns正向,Centos 7 搭建DNS正向解析和反向解析

Centos 7 搭建DNS正向解析和反向解析服务的三要素:安装-配置-启动1.使用yum安装DNSyum install bind -y2.修改配置文件vi /etc/named.conf修改以下内容&#xff1a;listen-on port 53 { any; };allow-query { any; };vi /etc/named.rfc1912.zones在末尾添加以下内容:zone "…

个人pkm软件 pim软件_个人申请软件著作权需要走哪些流程

软件著作权是企业的无形资产之一&#xff0c;它与商标权、专利权一起构成企业的知识产权&#xff0c;是企业投资、入股、融资等的有效无形资产&#xff0c;那么个人申请软件著作权需要走哪些流程&#xff1f;阅读完以下上海知识产权律师咨询为您整理的内容&#xff0c;一定会对…

最小值c语言 循环,C语言循环结构 -C语言求全班同学身高的最大值和最小值

编写程序&#xff0c;帮桐桐找出全班同学身高的最大值和最小值。问题分析输入&#xff1a;班级总人数&#xff1b;依次输入班上每位同学的身高值(float型)。输出&#xff1a;最大身高值和最小身高值(float型)。这是一个依次比较大小的问题&#xff0c;具体步骤为&#xff1a;1)…