/**
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;