《SAS编程与数据挖掘商业案例》学习笔记之六

八:modify语句((一个指针,两个pdv)

merge语句和update语句对数据集横向合并的主要功能还只能体现在匹配访问上,如通过by语句,对每个by组中的匹配数据集进行修改或更新,对于非常庞大的数据集需要定期更新,并且每次更新的观测对象是动态的时候,mergeupdate会消耗更多的资源,而是用modify可以通过高效的访问机制来实现这个需求

四种语法:

1.匹配访问

Data master_data;

  modify master_date  transaction_data;

  …;

  by variable;

Run;

注:除非使用output语句,否则data步后面只能接一个数据集,并且modify后面的第一个数据集必须和data步后面的数据集同名;

   by语句对应的是标识变量,不同于mergeupdate中的by语句对应的变量需要排序

   主数据集对应by变量的消除重复值后的集合应该包含更新数据集对应的by变量消除重复值猴岛集合;

   主数据集有重复时只更新第一条,更新数据集中有重复值时,最后一条起更新作用。

 2.索引访问

Data master_data;

  set transaction_data;

   modify master_data  key=variable;

  …..;

Run;

注:

更新数据集在主数据集没有找到主数据集key=对应的变量值,系统会设置自动变量_error_值为1,并在日志报错中显示该变量,

 

索引访问和匹配访问的不同点:

匹配访问中更新数据集同名变量会自动覆盖主数据集;索引访问会被当做不同的变量;

对于更新数据集出现by重复值的处理,索引访问会报错并终止程序,不过可以通过unique来纠正。


3.
观测序号访问

Data master_data;

  set transaction_data;

  modify master_data  point=variable;

  …;

Run;

如果更新数据集在主数据集中没有找到point=对应的变拉直,系统会自动设置自动变量_error_的值为1,另外point=有可能陷入死循环,需要配合stop使用。

 

4.顺序访问

Data master_data;

     modify master_data;

      …;

Run;

 

注:关于自动变量_iorc_,当运行modify语句时,_iorc_变量自动生成,包含系统每次运行modify语句时返回的I/O操作码,以匹配访问为例,如果主数据集by变量值在更新数据集中存在,自动变量_iorc_返回0,如果主数据集by变量值在更新数据集中不存在,不产生自动变量_iorc_,但是如果更新数据集by变量值在主数据集中不存在,自动变量_iorc_会返回一个非0值。

 

Eg:

修改观测值:

Data  a1;

   modify  a1;

   if  x=2  then y=200;

Run;

 

程序解读:首先编译,创建一个pdv,此时数据集a1处于打开状态,但是由于modify的独特机制,系统并没有另外开辟外存空间,所以整个程序运行过程中,在磁盘设备上看不到数据集a1的临时数据集。

由于modify语句采用动态where语句,而where查询动作是在pdv之前完成,因此当系统读到if x=2的时候,数据指针在pdv之前就指向该观测值并修改,最后由pdv输出,且输出的方式不是output而是replace方式,除非用户指定output。系统会默认采用replace方式输出。当用output的时候,喜欢很可能会陷入死循环。

 

商业应用:定期更改客户交易总额

主数据集:

Data master_trans;

   input  user_id  trans_amt @@;

  cards;

  101  1000  102 1500 103 2000

;

Run;

交易数据集:

Data day_trans;

Input user_id  day_amt @@;

Cards;

102  50  102  60  103  30  110  80

;

Run;

 

程序实现:

data master_trans;

modify master_trans day_trans;

by user_id;

trans_amt=trans_amt day_amt;

if _iorc_=0 then replace;

else do;trans_amt=day_amt;_error_=0;output; end;

run;

 

程序解读:

第一步:编译阶段,系统产生两条pdv,一条为master_trans所有,另一条为day_trans所有;

第二步:Master_trans的数据指针直接指向master_trans的第二条观测,同时day_trans的指针指向day_trans的第一条观测,执行累加语句trans_amt=trans_amt day_amt;执行完后,发现还有day_trans中还有一条观测与master_trans中的第二条观测匹配,于是,day_trans的数据指针指向day_trans的第三条观测,再次执行累加语句,知道day_trans中没有与之匹配的数据,系统会继续执行以下语句,接下来if _iorc_=0 then replace;被执行,因为该匹配是成功匹配,所以系统返回自动变量_iorc_=0,然后执行replace语句,

重复执行第二步,系统同样以replace方式输出master_trans的第三条观测,

此时master_trans的数据指针指向master_trans末尾,但是day_trans还有最后一条观测没有在master_trans中被发现,于是系统返回一个非零的自动变量_iroc_,此时将执行else后面的语句,最后执行output的输出方式到master_trans的末尾。

 

当然也可以用sqlmerge执行实现:

proc sql;

create table temp as

select

user_id

,sum(day_amt) as day_amt

from day_trans

group by 1;

quit;

proc sort data=master_trans;by user_id;run;

proc sort data=temp;by user_id;run;

data master_trans;

merge master_trans temp;

by user_id;

if trans_amt eq . then trans_amt=COALESCE(trans_amt,day_amt);

else trans_amt=sum(trans_amt,day_amt);

run;

 

总结:modify常用于根据某些需求条件更新特定变量组,或者对主数据集的某些变量做历史累加。

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

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

相关文章

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用开发过程。…

ASP.NET Web API中实现版本

一般来说,api 接口是提供给其他系统或是其他公司使用,不能随意频繁的变更。然而,需求和业务不断变化,接口和参数也会发生相应的变化。如果直接对原来的接口进行修改,势必会影响线其他系统的正常运行。这就必须对api 接…

一个娃娃竟然拍出50万......

1 瞎说什么大实话(素材来源网络,侵删)▼2 这个娃娃50万用来求婚用(素材来源网络,侵删)▼3 当代年轻人的特别祝福▼4 在福字底下加一横(素材来源网络,侵删)▼5 冰激凌…

切图崽的自我修养-规范CSS元素命名

前言 为什么我刚才写的样式乱了?!如何给变量,文件命名是程序员的老大难问题。命名为什么会这么难,因为它太重要了。可以这么说,准确的命名可以提高代码的可读性,让人容易理解,方便调试&#xff…

批量获取域名解析地址socketthread

import threadimport socketdef getIP(name,lock):print [%s]:%s\n%(name,socket.gethostbyname(name))lock.release() #释放线程锁def main():#读取存放域名的文件,文件是按一行一个域名的方式记录的files open(rC:\Users\Administrator\Desktop\python_script\na…

《SAS编程与数据挖掘商业案例》学习笔记之七

九:put语句 可以输出变量信息到指定地点,包括输出到sas系统的日志窗口; 输出到file语句规定的外部文件 输出到sas系统的output窗口 单尾操作符,多用于input语句中,双尾操作符,多用于put语句中。 Data a; In…

使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器

从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能。细化了很多权限操作。 今天对这一块做个介绍。 要做一个认证管理,大概分为以下5步: 1. 定义你要保护的资源,一般是服务、函数,…

算法分析笔记

2019独角兽企业重金招聘Python工程师标准>>> 定义 定义&#xff1a; 若存在正常数 c 和 n<sub>0</sub> 使得当 N ≥ n<sub>0</sub> 时 T(N) ≤ cf(N)&#xff0c;则记为 T(N) O(f(N))若存在正常数 c 和 n<sub>0</sub> 使得当 …

C++指针详解

C指针详解指针的概念 指针是一个特殊的变量&#xff0c;它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容&#xff1a;指针的类型&#xff0c;指针所指向的类型&#xff0c;指针的值或者叫指针所指向的内存区&#xff0c;还有指针本身所…

.NET 6新特性试用 | PriorityQueue

前言我们常用Queue<T>类来表示先进先出(FIFO)集合&#xff0c;集合中的对象按照放入顺序检索。例如&#xff1a;var jobs new Queue<Job>();jobs.Enqueue(new Job() { Id 1 }); jobs.Enqueue(new Job() { Id 2 }); jobs.Enqueue(new Job() { Id 3 });while (jo…

数字效率Evernote超效率数字笔记术

文章结束给大家来个程序员笑话&#xff1a;[M] 每日一道理 古人云&#xff1a;“海纳百川&#xff0c;有容乃大。”人世间&#xff0c;不可能没有矛盾和争吵&#xff0c;我们要以磊落的胸怀和宽容的微笑去面对它 。哈伯德也曾说过&#xff1a;“宽恕和受宽恕的难以言喻的快乐&a…

千万别让爸妈帮你P图......

1 如何把外来称呼本土化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好家伙&#xff01;洪世贤家烛台上插的是火腿肠▼4 妨碍公务的下场&#xff08;素材来源网络&#xff0c…

对大数据知识架构的梳理

近期交接了前期的大数据项目&#xff0c;对之前的项目内容做一个总结。也算是梳理一下项目的架构&#xff0c;对前期也算是一个总结&#xff0c;为后期的学习打下一个基础。清理数据对传统行业来说&#xff0c;上来就说要搞大数据&#xff0c;一般都会是一种噱头&#xff0c;因…

WPF 不遮挡任务栏最大化和全屏显示

在窗体不去边框的情况下&#xff0c;不遮挡任务栏最大化MainWindow.xaml.csusing System; using System.Windows; using System.Windows.Threading;namespace thzSoftware {/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWi…

C#中'??'符的使用

?? 用于判断当前对象是否为null. 语法: 对象 ?? "当前对象为null时赋的默认值". string nullString null; string Kong ""; string a nullString ?? "能判断为null"; string b Kong ?? "能判断为空"; 执行结果&#xff1…

将 iOS 应用的体积控制在 20MB 以内对于其下载量有很明显的影响吗?

分类&#xff1a;iPhone开发 标签&#xff1a;App大小、下载量、应用体积 比如&#xff0c;Angry bird 、Cut The Rope 游戏内容很丰富的应用都能将其体积控制在 20MB 。iOS 限制允许 3G 网络下载应用的体积不超过 20MB &#xff0c;通过 3G 下载的应用用户非常多吗&#xff1…

看完后震惊!清华“姚班”创始人的老师究竟有多牛?他说孩子最应该培养这几个思维……...

▲ 点击查看相信很多人都挺听说过清华有个“姚班”&#xff0c;致力于培养与美国麻省理工学院等世界一流高校本科生具有同等、甚至更高竞争力的计算机科学人才。“姚班”是我国著名科学家姚期智所创&#xff0c;因此得名“姚班”。姚期智教授是2000年图灵奖得主&#xff0c;也是…

Android之线程池

http://www.trinea.cn/android/java-android-thread-pool/ 介绍new Thread的弊端及Java四种线程池的使用&#xff0c;对Android同样适用。本文是基础篇&#xff0c;后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗&#xff…

数据库自增主键可能产生的问题

在MySQL中经常会配置自增长属性的字段作为主键&#xff0c;特别是使用InnoDB存储引擎&#xff0c;因为InnoDB的聚集索引的特性&#xff0c;使用自增长属性的字段当主键性能更好&#xff0c;但是使用自增主键也可能会带来一些问题。 举个例子&#xff0c;使用自增主键对数据库做…