数据处理之求和语句,retain语句

先看下面的一个例子:


DATA A;
INPUT X Y @@;
S+X;
DATALINES;
3 5 7 9 20 21
PROC PRINT;
RUN;

衍生的新变量s为与x变量的求和,我们看结果

Obs X Y S

1 3 5 3

2 7 9 10

3 20 21 30

上面的S+X语句看上去怪怪的,能不能换成S=S+X;这样比较符合我们的变成习惯。那么将S+X;替换为S=S+X;后我们看结果:

Obs X Y S

1 3 5 .
2 7
9 .
3 20 21
.

结果出乎意料,这里的S变量的值全部为默认你缺失值.;或者根本就没对S变量进行赋值,原因是没有对S赋初值,既然这样那就对S变量赋初值0吧,加上S=0;这一语句试试:

Obs X Y S

1 3 5 3
2 7
9 7
3 20 21
20

结果是S变量的值与X的值完全一样,这是因为sas数据步读取数据是循环的过程,加上S=0;语句,实际上是每次循环时重新对S变量赋值为0,所以S变量的值会与X的值完全一样,要想S变量实现求和,并且能用S=S+X;该语句,这就要用到RETAIN语句的作用了;


DATA A;
INPUT X Y @@;
RETAIN S 0;
S=S+X;
DATALINES;
3 5 7 9 20 21
PROC PRINT;
RUN;

结果和第一段代码的结果一样;

这里,RETAIN S
0;语句相当于为S赋初值为0;但是和S=0;这一语句不一样的是:当数据部循环第二次读取数据时,会跳过RETAIN语句的执行,即循环时,S变量会一直保存计算值而不会被再次初始化。这就是RETAIN语句的作用。

时间: 2024-10-30 23:00:39

数据处理之求和语句,retain语句的相关文章

SAS笔记(2) RETAIN语句

本文重点: 使用RETIAN,INPUT在每次循环执行时保留上一次PDV中的变量值. SUM语句和SET语句会自动RETAIN变量. 1. RETAIN语句 1.1 Example 1 先来看看在DATA步不使用和使用RETAIN语句的差异 没有使用RETAIN: DATA WITHOUT_1; PUT "Before the INPUT statement: " _ALL_; INPUT X @@; PUT "After the INPUT statement: "

千峰培训Day04-java基础学习:for语句.while语句,do-while语句

课程回顾: 程序的结构: 分支结构: 1.if-else 格式:if(boolean类型表达式){代码块}[else if(boolean型表达式){代码块}……][else{代码块}] //注意:if(boolean类型表达式){代码块}-else if(boolean型表达式){代码块}-else{代码块}:else语句可有可不有. 2.switch 格式:switch(表达式) { case 常量值1:代码块;break; …… [default :代码块;break;] } 表达式:by

JavaScript基本语法 -- 条件语句 & 循环语句

条件语句 条件语句(Conditional statement)是JavaScript里面的基本结构之一,程序根据表达式的真假决定执行或者跳过某个分支,于是,条件语句有时候也可以称为"分支语句" 1. if & else if & else 基本写法如下: if (表达式1) { // 如果表达式1为真,执行代码块1 代码块1 } else if (表达式2) { // 如果表达式2为真,执行代码块2 代码块2 } else { // 否则,执行代码块3 代码块3 }

面向对象----构造方法、this 关键字、函数的参数传递、package语句/import语句

构造方法 构造器的定义.作用 构造方法的特征 它具有与类相同的名称:它不含返回值: 注意:在构造方法里不含返回值的概念是不同于"void"的,在定义构造方法时加了"void",结果这个方法就不再被自动调了. 构造方法的作用 当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码.这就好像我们规定每个"人"一出生就必须先洗澡,我们就可以在"人"的构造方法中加入完成"洗

8.INSERT INTO 语句 UPDATE 语句

1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing') 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) INSERT INTO Persons

条件判断语句 if语句/switch语句

if(条件表达式)语句 if语句即条件判断语句,对于if语句括号里的表达式,ECMAScript会自动调用Boolean()转型函数将这个表达式的结果转换成一个布尔值.如果值为true,执行后面的一条语句,否则不执行 <script type="text/javascript"> var box = 100; if (box > 50) //if 语句里的表达式如果返回的false,只会不执行后面的一条语句 alert(box); //第二条语句,和if语句无关,所以

15-07-02 语句-分支语句

语句: 语句的类型包括声明语句,表达式语句,选择语句,循环语句,跳转语句,异常语句. 一:声明语句:入新的变量和常亮.变量声明可以选择为变量赋值.再常量声明中必须赋值. 例: int i = 0;    //声明变量 i 并赋值,也可以不赋值. double a; 二:表达式语句:用于计算值的表达式语句不许再变量中存储该值. 例: sum = i + j;    //变量 i 和 j 在此之前必须先赋值,而且 sum 也需要声明类型. int x = a + b;   //或者在声明的同时进行运

JavaScript - 对象专用语句[ with语句 ]

<html> <head> <head> <body> <script language="javascript"> // 对象专用语句 // with语句 /* * with(对象名称){ * 执行语句块 * } */ var current_time = new Date(); with(current_time){ var strDate = getYear() + "年" ; strDate +=

swift 简单语句 控制流语句

在 Swift 中.有两种类型的语句:简单语句和控制流语句.简单语句是最常见的.用于构造表达式和声明.控制流语句则用于控制程序运行的流程,Swift 中有三种类型的控制流语句:循环语句.分支语句和控制传递语句. 循环语句用于反复运行代码块.分支语句用于运行满足特定条件的代码块:控制传递语句则用于改动代码的运行顺序.在稍后的叙述中,将会具体地介绍每一种类型的控制流语句. 是否将分号(;)加入到语句的结尾处是可选的.但若要在同一行内写多条独立语句,请务必使用分号. GRAMMAR OF A STAT