02_iterativo2_retain_if_where

/**
RETAIN
**/
retain variable valor;
Inicializa variable a valor, en la siguiente iteración guarda el siguiente valor.
Hace que la var. tome el valor en la primera iteración del paso DATA, y luego retenga el
valor que la variable vaya tomando de una iteración a otra. Otras opciones de sintaxis de esta
sentencia son:
RETAIN var;
Inicializa variable a missing
Hace que la var. tome el valor missing sólo en la primera iteración y después vaya
guardando los valores que tome.
RETAIN lista variables;
Como en el caso anterior, pero para todas las variables con que se trabaje.
RETAIN lista variables valor;
Todas las variables toman todas el mismo valor inicial valor y después guardan los valores
de una iteración a otra.
RETAIN var1 valor1 var2 valor2 ...;
Las variables toman respectivamente los valores iniciales y después guardan los valores de
iteración a otra.

Ejemplo: las variables son missing inicialmente
Queremos hallar la suma de los valores de una variable. Sin embargo:
data;
input b;
suma=suma+b;
put suma=;
cards;
3 4 5
;
da en la ventana LOG:
suma=.
suma=.
suma=.
pues la variable suma no está inicializada inicialmente y las operaciones con valores missing
dan como resultado valor missing.
De igual modo, no sirve utilizar la sentencia suma=0; inicialmente pues el paso data pasa
todas las veces por esa sentencia, volviendo suma=0 cada vez, y no acumulando los valores
anteriores.

Ejemplo: cálculo de la suma de observaciones leídas con input
data;
retain suma 0;
input b;
suma=suma+b;
put suma=;
cards;
3 4 5
;
pondría en la ventana LOG:
suma=3
suma=7
suma=12

data software.ejemplo;
input x;
suma=suma+x;
cards;
2 3 5 8
;
run;

data software.ejemplo;
retain suma 0;
input x @@;
suma=suma+x;
cards;
2 3 5 8
;
run;
proc print data=software.ejemplo;
run;
Ejemplo: cálculo del mínimo de observaciones leídas con input
Hallar el mínimo de los valores de la variable b .

data minimo;
retain m ;
input b @@;
m=min(b,m);
put m=;
cards;
2 5 7 8 -1
;
da:
M=2
M=2
M=2
M=2
M=-1
/**
En el ejemplo anterior se ha utilizado el hecho de que si m es missing, cualquier valor x no
missing cumple que la función min(x,m)=x.
**/
Sentencia IF expresion ;

Ejemplo: Selección de observaciones con IF
data uno;
input x;
if x>6
cards;
2 5 7 8 -1
;
Se obtiene como resultado el archivo uno:
x
7
8


data software.ejemplo;
retain maximo 0;
input x y;
if x>maximo then maximo=x;
put maximo;
cards;
2 8
5 1
7 2
1 4
;
run;
proc print data=software.ejemplo;
run;
data software.ejemplo;
retain maximo;/*missing s� se compara con n�meros, aunque no opera con ellos*/
input x y;
if x>maximo then maximo=x;
put maximo;
cards;
2 8
5 1
7 2
1 4
;
run;
proc print data=software.ejemplo;
run;
data software.ejemplo;
retain maximo;/*missing s� se compara con n�meros, aunque no opera con ellos*/
input x y;
maximo=max(maximo,x);/*con una funci�n en vez de un if*/
put 'm�ximo:' maximo;
cards;
2 8
5 1
7 2
1 4
;
run;
proc print data=software.ejemplo;
run;
data software.ejemplo;

input x y;
maximo=max(x,y);
put 'm�ximo:' maximo;
cards;
2 8
5 1
7 2
1 4
;
run;
proc print data=software.ejemplo;
run;
data software.ejemplo;

input x y sexo $;
if x=y then output;
cards;
2 2 M
5 1 V
7 7 V
1 4 M
;
run;
proc print data=software.ejemplo;
run;
data software.ejemplo;
set software.estudiantes;

if peso>70 then output
software.ejemplo;
run;

data software.mediapeso;
set software.ejemplo;
retain total 0 n 0 media 0;/*podemos mirar n en el fichero y no crear la variable n*/
total=total+peso;
n=n+1;
media= total/n;
run;
proc print data=software.mediapeso;
run;

/*Equivale a los dos anteriores en uno solo*/
data software.pesos;
set software.ejemplo;
retain media 0 suma 0 n 0;
if peso>70;
suma=suma+peso;
n=n+1;
media=suma/n;
run;
proc print data=software.pesos;
run;
Sentencia WHERE expresión;
WHERE expresion lógica;
donde expresion puede ser cualquier expresion lógica, pudiendo contener funciones SAS.
Funciona como la sentencia IF expresion; , salvo que WHERE sólo deja leer las
observaciones que cumplen su condición, mientras que IF deja leer la observación y para su
proceso si no cumple la condición.
WHERE es la primera sentencia ejecutada después de SET ,MERGE. No funciona con
INPUT( mientras que IF ; sí.).
Ejemplo: selección de observaciones con Where

Tenemos los datos de varios individuos en el archivo uno:
data uno;
input mes $ ingresos;
cards;
julio 10000
agosto 13000
septiembre 15000
mayo 20200
junio 8800
;

Y queremos conservar en otro archivo los ingresos cuyo logaritmo sea mayor de 5, en los
meses julio, agosto y septiembre.
data dos;
set uno;
where mes in ('julio','agosto','septiembre');
if log(ingresos)>5;
run;

 

Correo

Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.

Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.