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

继续之前的读书笔记,本次讲解sas主要的变量操作,包括基本赋值语句、累加语句、keep语句、retain语句、array语句、rename语句、length语句。


1.基本赋值语句

z=x y;

z=sum(x,y);  sum函数的好处是可以克服缺失值的影响;

 

2.如果表达式中既有数值型变量又有字符型变量的话,则会将字符型变量转化为数值型变量

3.系统在编译阶段,对于赋值语句变量,如果是字符型变量则长度为1,如果是数值型变量则长度为8,接下来,系统将执行赋值语句,这时变量长度将由第一次读入的表达式的运算结果决定。一旦第一次读入确定长度之后,下一次pdv无论读入多长的数据,都不会改变变量的长度。除非提前用length语句限定变量的长度。

 

4.累加语句

x 1,x (-1)都是累加语句,其中x必须是数值型变量,在编译阶段,pdv自动设置累加变量值为0,它的值从当前执行后一直保留在pdv中,直到下一次执行为止。

在项目实践中,一般用retain语句替代累加语句,因为retain语句可以初始化累加变量为一个非零值,而累积语句初始值只能为0.

 

5.keep语句(keep语句不是可执行语句)

Data a3;

  set sashelp.class(keep=name weight);

  x=1;

  keep name x;

Run;

 

Data a4(keep=name x);

    set sashelp.class(keep=name weight);

    x=1;

Run;

以上两个程序输出结果一样,

但是对于读入数据集时,keep=的形式性能要远高于keep的形式,因为keep=的形式是仅限后面的变量进入pdv,对于拥有几百个变量的数据集而言,keep=效率要高;

不过对于数据输出方面,keep=keep性能没有区别;上面两个语句性能完全一样。

6.retain语句(不是一个可执行语句

pdv运行规律:data语句与run语句构成了一个循环语句,一般情况下每读一遍data步所有语句时,pdv都会清空所有变量值,并设置为缺失值。然后根据执行语句,再次对变量进行赋值。当data步使用retain语句时,pdv则不会清空retain语句对应变量,而是一直保留直到下次该变量再次执行。

retain语句在data步中有着广泛的应用,对于数据集的操作可以到单元格,而一般函数只能操作到列,实际应用中retain会使程序更加灵活化。可以控制一个变量的值不变,除非有外部的条件的变化而变化。

retain语句主要实现以下需求:

汇总数据,累加变量,纵向比较变量,创建flag标识变量,处理缺失值,迭代累加字符变量值。

Eg:关于汇总数据的一个例子(按照每个id,汇总cns的值,汇总id的记录数,如果txn_cde变量取101201两个值,则累加计算一次,计算txn_dte的最小值,)

libname chapt4 "f:\data_model\book_data\chapt4";

data chapt4.retain1;

input id txn_cde$ cns txn_dte$;

cards;

10 101 10 20070101

10 101 20 20080402

10 201 30 20050203

20 101 40 20040105

20 201 50 20040105

20 301 60 20070806

20 201 70 20050607

30 301 80 20070501

30 401 90 20070306

;

run;

 

proc sort data= chapt4.retain1;by id txn_dte;run;

data test1;

set chapt4.retain1;

by id txn_dte;                                                          -- 按照id txn_dte排序后逐条读取数据

retain min_dte sum_cns cnt cnt_condition;

if first.id then do;                                             --由于赋值语句比较多,需要用do语句套住所有的赋值语句,不是循环。

min_dte=txn_dte;

sum_cns=0;

cnt=0;

cnt_condition=0;

end;

min_dte=min(min_dte,txn_dte);

sum_cns cns;

cnt 1;

cnt_condition (txn_cde in("101" "201"));

if last.id;             ---只有每次id对应数据读完后才会执行此举。

run;

整个程序分为5个模块,

Set/by模块:set语句是读数据集,必不可少,一定注意by语句不能丢,by后面的变量就是之前排序中的变量。

retain模块:对需要retain的变量进行声明

first模块:对retain变量按照每一个first.id做初始化

主体模块:该模块介于firstlast之间,主要是完成对需求的运算

last模块:该模块主要完成最后的输出。

 

7.array语句

arraysas中其实是一个变量指针,他真用内存空间约4B,其作用是指向需要操作的变量对象,array可以把无序的无规则的变量名统一,

常用的array语句:

Array  rain{5}   x1-x5;   数组中有5个元素,分别为x1-x5

Array  ar(3);    输出变量默认为ar1-ar3

Array  ar(1:3)  等价于上一个

Array  x{1:5,1:3}  score1-score15;  规定一个5*3二维数组,score1-score15一次逐行放入数组

Array  ab(*)  x y z;     等价于array ab(3)  x y z;

Array  test(3) _temporary_  (90  80  70)

Array days{7} d1-d7 (1,2,3,4,5,6,7);

 

数组函数:

维度函数dim(),array mult {5,10,2} mult1-mult100,

dim(mult)=dim(mult,1)=5

Dim2(mult)=dim(mult,2)=10

Dim3(mult)=dim(mult,3)=100

 

Eg:

options pageno=1 nodate ps=64 ls=80;

data temp;

input x @@;

cards;

10 20 30

;

run;

data test (drop=i);

   set temp;

   array a(5) A1-A5;

   do i=1 to 5;

      a(i)=i;

   end;

run;

proc print noobs data=test;

run;

总结:array其实是一个横向操作语句,也就是说,当数据指针停留在某一条观测时,可以通过array语句,把所有的array声明的变量都操作一遍。

 

商业实战:

缺失值的填充;

data missing;

input x y$ z$ m;

cards;

. . . 1

2 . 3 .

;

run;

 

data result;

set missing;

array char _character_;

array numr _numeric_;

do over char;

if char eq "" then char="null";

end;

do over numr;

if numr eq . then numr=0;

end;

run;

对于所有的字符型变量。缺失时都赋值为null。对于所有的数字型变量,缺失事都赋值为0

 

常见累加器,比如统计价格人数

data score;

input id$ x y z;

cards;

a 75 84 65

b 54 74 71

c 51 56 52

d 50 50 60

;

run;

 

data qualify;

set score;

k=0; 

array chengji(3) x y z;

array base(3)_temporary_(60,60,60);

do i=1 to 3;

if chengji(i) ge base(i) then k 1;     

end;

if k=3 then output qualify;

run;

统计所有成绩都及格的学生记录。

 

横向排序变量

data a;

input x1-x7;

cards;

23 44 81 13 42 34 26

14 18 10 20 33 11 50

;

run;

 

data final;

  set a;

  array arr(1:7) x:;

  array copy(1:7) cx1-cx7;

  do m=1 to dim(arr);

  copy(m)=arr(m);

  end;

    do i=1 to dim(copy);

     do j=i 1 to dim(copy);

       if copy(j)>copy(i) then do;

       temp=copy(j);copy(j)=copy(i);copy(i)=temp;

       end;

     end;

    end;

run;

利用冒泡算法实现横向排序

 

纵向横向综合应用:删除缺失值比例超过一定阈值的变量列表:

options symbolgen;

data missing;

input n1 n2 n3 n4 n5 n6 n7 n8 c1$ c2$ c3$ c4$;

datalines;

1 . 1 . 1 . 1 4 a . c .

1 1 . . 2 . . 5 e . g h

1 . 1 . 3 . . 6 . . k l

1 . . . . . . . a b c d

;

data _null_;

if 0 then

  set missing nobs=obs;

  array num_vars[*] _NUMERIC_;

  array char_vars[*] _CHARACTER_;

  call symputx('num_qty', dim(num_vars));

  call symputx('char_qty', dim(char_vars));

  call symputx('m_obs',obs);

  stop;

run;

%put &num_qty &char_qty &m_obs;

data _null_;

  set missing end=finished;

  array num_vars[*] _NUMERIC_;

  array char_vars[*] _CHARACTER_;

  array num_miss [&num_qty] (&num_qty * 0);

  array char_miss [&char_qty] (&char_qty * 0);

  length list $ 50;

  do i=1 to dim(num_vars);

    if num_vars(i) eq . then num_miss(i) 1;

  end;

  do i=1 to dim(char_vars);

    if char_vars(i) eq '' then char_miss(i) 1;

  end;

  if finished then do;

  do i= 1 to dim(num_vars);

    if num_miss(i)/&m_obs. ge 0.7 then list=trim(list)||' '||trim(vname(num_vars(i)));

  end;

  do i= 1 to dim(char_vars);

    if char_miss(i)/&m_obs. ge 0.7 then list=trim(list)||' '||trim(vname(char_vars(i)));

  end;

  call symputx('mlist',list);

  end;

run;

%put &mlist;

data notmiss;

  set missing(drop=&mlist);

run;

这是一个典型的array语句和retain语句综合应用的例子

第一个_null_程序,区分并计算所有数值型和字符型变量的个数,并把结果赋值给两个不同的宏变量;同时获取数据集missing的观测数,也赋值给另外一个宏变量m_obs;整个程序都是在编译阶段完成的,没有任何的执行语句,这是为了提高效率,

第二步,对数值型和字符型分布计算每一个变量的缺失值个数,并累加,最后根据预设的阈值,,找到满足的所有变量,并赋值给宏变量mlist

第三步:data步,drop满足条件的变量。

第二步说明“:

编译过程声明了四个数组,

num_vars指向所有的数值型变量(n1-n8,使用_numeric_故不再输出数据集中显示

char_vars指向所有的数值型变量(c1-c8,使用_character_故不再输出数据集中显示

数组num_miss,默认变量名是num_miss1-num_miss8,并设置初始值为0

数组char_miss,默认变量名是char_miss1-char_miss8,并设置初始值为0

接下来程序读取数据集missing第一条观测,执行两个do语句,

第一个do语句,获得num_miss1=0,num_miss2=1,`````num_miss8=1

第二个do语句,获得char_miss1=``````

接下来,判断if finished语句,由于还没有读到文件末尾,所以程序不会执行该语句,直接run语句,输出第一条观测,程序调回data开头,继续执行下一个观测,

依次下去,知道最后一条记录。然后执行if finshed语句,完成最后两个do语句:

第三个do语句,执行8次,如果缺失值超过70%,则执行

list=trim(list)||' '||trim(vname(num_vars(i))),从而获取全部的缺失值大于70%的数值型变量;

第四个do语句,同样的道理

 

最后总结,array语句在处理横向操作方面功能非常庞大,只要有array出现的地方,就要有do语句,

 

8.rename语句

Rename   old_name=new_name;

注意:rename语句是一个声明语句,不是赋值语句

rename语句如果和keep语句同时出现的时候,系统先编译keep语句,后编译rename语句。drop类似于keep语句。

eg

data a;

input x y;

cards;

1 2

;

data b;

set a;

rename y=yy;

keep x y;

run;

 

9.length语句

Length m1 3  m2  $8;

Length  m1  m2 7;

都是合法的length语句

可以改变原有数据集变量的长度。对于字符型变量,语句要在set语句之前,对于数值型变量,可以在任何地方,

10.label语句

Label  x1='ab'  x2='cd';

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

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

相关文章

title与h1标签的区别和联系

很多新站长在网站SEO过程中,会认为把H1等同于Title。 其实两是有区别和联系的,两者不能划等号。下面主要从文章和页面角度分析title和H1。 H1等同于title吗? H1不等于title。H1,大标题。一般出现在文章页面,作用如同一张报…

浅谈C++类(5)--友元

欢迎转载,但请标明作者 “九天雁翎”,当然,你给出这个帖子的链接更好。 呵呵,又来了,自从我开始尝试描述类以来,我发现我自己是开始真的了解类了,虽然还不到就明白什么叫oo的高深境界&#xff0…

.NET 云原生架构师训练营(系统架构)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章目录对外展现的功能内部功能功能交互与价值通路系统架构目标认识系统的价值通路认识功能架构,通过把功能结构与形式结构结合来描…

JFinal整合CKFinder

2019独角兽企业重金招聘Python工程师标准>>> 使用JFinal对之前的系统进行重构,老系统使用了CKEditorCKFinder编辑器,发现在web.xml中配置ConnectorServlet会被JFinalFilter过滤处理,而且使用JFinal之后也不想在web.xml中增加额外的…

通过简单的Word Count讲解MapReduce原理以及Java实现

MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是&q…

经验总结03-dwr

java使用dwr进行ajax请求。 1.编写对应的查询数据的类。 2.添加dwr.jar&#xff0c;可直接复制到lib下。 3.在dwr.xml配置对应的类&#xff0c;让其可在页面中调用类。<create creator"new" javascript"test"><param name"class" value…

浅谈C++类(6)--复制构造函数

欢迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 还记得&#xff08;1&#xff09;中讲到的构造函数吗&#xff1f;复习一下&#xff0c;这次我们重载一个新的默认构造函数--即当你不给出初始值时调用的构造函数&#x…

.NET 6新特性试用 | TryGetNonEnumeratedCount

前言.NET 6新增了TryGetNonEnumeratedCount方法&#xff0c;计算可枚举类型的元素总数。LINQ不是已经有了Count方法吗&#xff0c;为什么还要画蛇添足呢&#xff1f;Demo尝试下列代码&#xff1a;var b new B<int>(); Console.WriteLine($"{b.Count()}");var …

阻塞队列之七:DelayQueue延时队列

一、DelayQueue简介 是一个无界的BlockingQueue&#xff0c;用于放置实现了Delayed接口的对象&#xff0c;其中的对象只能在其到期时才能从队列中取走。这种队列是有序的&#xff08;PriorityQueue实际存放Delayed接口对象&#xff09;&#xff0c;即队头对象的延迟到期时间最短…

研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌

全世界只有3.14 % 的人关注了爆炸吧知识本文转自科研大匠“喝酒上脸的人能喝&#xff01;”这句话&#xff0c;不管来自天南还是海北的&#xff0c;在酒桌上&#xff0c;肯定都耳熟能详有没有&#xff1f;其实&#xff0c;喝酒“上脸”并不意味着能喝&#xff0c;而是一种基因突…

PHP中如何配置smarty框架实现PHP代码和HTML代码分离

header(Cache-Control:Private);//保留用户填写的信息 session_start();//开启缓存 define(MYCMS,UTF-8);//定义网站编码常量 define(ROOT,str_replace(\\,/,realpath(dirname((__FILE__))./../)));//定义根目录常量 ../是返回上级目录 define(TPL,ROOT./tpl);//定义网页模板的…

Hook API (C++)

一、基本概念&#xff1a; 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且 所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序…

本科、硕士、博士的区别(终极版)

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术本科生和研究生到底有何区别&#xff1f;硕士和博士又有什么不同&#xff1f;这是很多人都有的困惑&#xff0c;对于这个问题的说法也有很多版本&#xff0c;我们挑选了几个比较经典的版本&#xff0c;以期能和大家一同探…

C# Jpush 极光推送消息推送

简介消息推送&#xff08;Push&#xff09;指运营人员通过自己的产品或第三方工具对用户移动设备进行的主动消息推送。用户可以在移动设备锁定屏幕和通知栏看到push消息通知&#xff0c;通知栏点击可唤起APP并去往相应页面。我们平时在锁屏上看到的微信消息等等都属于APP消息推…

Linux 环境变量 $PATH

我们知道查阅文件属性的指令 ls 完整文件名为&#xff1a;/bin/ls(这是绝对路径)&#xff0c;那为什么可以在任何地方执行/bin/ls 这个指令呢&#xff1f; 为什么在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢&#xff1f; 这是因为环境变量 …

文件项目SVN+TortoiseSVN+Subclipse使用总结

近来使用开辟的过程中涌现了一个小问题&#xff0c;顺便记录一下原因和方法--文件项目 一、SVN、TortoiseSVN、Subclipse分析 团队开辟技术&#xff1a; (1)单元测试&#xff1b;(2)版本控制&#xff1b; (3)项目主动化&#xff1b; SCM:软件配置管理&#xff0c;包含SVN&#…

PHP中常见的五种设计模式

设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为。实际上&#xff0c;设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利&#xff0c;那么它们又是什么&#xff1f;为什么说它们在 PHP 应用程序中非常有用&#xff1f;本文解释了这些问题。 设…

Java常用类集接口以及实现方式总结

最近学习map-reduce原理以及map-reduce编程&#xff0c;于是顺带着学习下Java编程&#xff0c;对于Java常用的数据结构和类集&#xff0c;我总结到mind图中&#xff0c;便于理清相互之间的关系 package leiji; import java.util.ArrayList; import java.util.List; import java…

Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)

www.cnblogs.com/mythou/p/3153880.html 最近工作都在修改Launcher&#xff0c;所以打算把分析源码和修改源码的过程记录下来&#xff0c;最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher&#xff0c;所以后面文章里面的Launcher都是基于Android4.0.…