2011 Paso DATA Cap 07 Control de Flujo

25
 7 Capitulo: Control de flujo en SAS SAS dispone de dos ti pos de sentencias de control de flujo, l as sentencias condicionales y las sentencias de bucles o de repetición. 7. 1. Sentencias cond ici onales: Sentenc ia IF-THEN-ELSE La sentencia principal de bifurcación en SAS es la sentencia IF-THEN-ELSE cuya sintaxis es: IF (expresión) THEN sentencias ejecutables;  ELSE sentencias ejecutables;  Si la condición de la expresión es cierta, se ejecutarán las sentencias posteriores a THEN, continuando después el curso del programa, salvo las sentencias del ELSE. Si la condición es falsa, se ejecutarán las sentencias del ELSE, continuando después el curso del programa. Si no hay ELSE, se continuará en la sentencia siguiente. Ejemplo 1: Trabajando con el fichero 'Work.Campamento', borrar de la memoria los casos en los que edad<15: DATA  C am pam ent o; I NPU T N om br e $ 9. Edad Not a Se xo $; D ATA LI NES; Manu el 16 6. 8 M El ena 13 6. 2 F Rosa 17 5. 9 F M. Fl avi a 18 7. 0 F Pr ud en ci o 14 5. 9 M Casi m i r a 15 8. 7 F ; PROC PRINT; RUN; / * El i m i naci ón de l os casos con edad menor que 15 */  DATA  uno; SET  C am pam ent o; IF edad< 15  TH EN  DELETE; OUTPUT; run; PROC PRINT DATA =uno; RUN; El código anterior se puede simplificar, DATA  dos; SET  C am pam ent o; IF edad< 15  TH EN  DELETE; / * El i m i namos l a sentenci a OU TPU T*/  run; PROC PRINT DATA =dos;  TI TLE 'Este es el f i cher o dos' ;

Transcript of 2011 Paso DATA Cap 07 Control de Flujo

Page 1: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 1/25

 

7  Capitulo: Control de flujo en SAS

SAS dispone de dos tipos de sentencias de control de flujo, las sentenciascondicionales y las sentencias de bucles o de repetición.

7.1. Sentencias condicionales:

Sentencia IF-THEN-ELSE 

La sentencia principal de bifurcación en SAS es la sentencia IF-THEN-ELSE cuya

sintaxis es:

IF (expresión) THEN sentencias ejecutables;  

ELSE sentencias ejecutables;  

Si la condición de la expresión es cierta, se ejecutarán las sentencias posteriores a

THEN, continuando después el curso del programa, salvo las sentencias del ELSE.

Si la condición es falsa, se ejecutarán las sentencias del ELSE, continuando después

el curso del programa. Si no hay ELSE, se continuará en la sentencia siguiente.

Ejemplo 1: Trabajando con el fichero 'Work.Campamento', borrar de la memoria los

casos en los que edad<15:

DATA Campamento;INPUT Nombre $ 9. Edad Nota Sexo $;

DATALINES;

Manuel 16 6.8 M

Elena 13 6.2 F

Rosa 17 5.9 F

M. Flavia 18 7.0 F

Prudencio 14 5.9 M

Casimira 15 8.7 F

;

PROC PRINT;RUN;

/* Eliminación de los casos con edad menor que 15 */ DATA uno;

SET Campamento;

IF edad<15 THEN DELETE;

OUTPUT;

run;PROC PRINT DATA=uno;

RUN; 

El código anterior se puede simplificar,

DATA dos;

SET Campamento;IF edad<15 THEN DELETE; /*Eliminamos la sentencia OUTPUT*/ 

run;PROC PRINT DATA=dos;

TITLE 'Este es el fichero dos';

Page 2: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 2/25

 

Statistical Analysis System DATA

-1 -

RUN;

Y todavía se puede simplificar más.

DATA tres;

SET Campamento;

IF edad >= 15 ; /*Eliminamos la sentencia OUTPUT, DELETE y laclausula THEN*/ 

RUN;PROC PRINT DATA=tres;

TITLE 'Este es el fichero tres';

RUN; 

Ejemplo 2: Crear dos archivos (Cam_M y Cam_F) para separar los casos masculinos

de los femeninos.

/* Creación de dos ficheros para clasificar a hombres y mujeres */ 

DATA Cam_M Cam_F; /*Creamos dos ficheros temporales*/ 

SET Campamento;

IF Sexo = 'M' THEN OUTPUT Cam_M ;

ELSE OUTPUT CAM_F;

RUN;PROC PRINT DATA=Cam_M;

TITLE 'Este es el fichero de hombres';

RUN;PROC PRINT DATA=Cam_F;

TITLE 'Este es el fichero de mujeres';

RUN;

En los dos ejemplos anteriores tanto si se cumple la expresión como si se va a la

clausula THEN hay una única sentencia que ejecutar. Cuando se necesita ejecutar 

más de una sentencia hay que encerrar el conjunto de sentencias entre la estructura,

DO;Sentencia1;Sentencia2;……………. ;

END;

Page 3: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 3/25

 

Statistical Analysis System DATA

-2 -

Ejemplo 3: Trabajando con el archivo de datos 'Work.Alumnos', se pide:

a) Calcular el índice de masa corporal y expresar la altura en metros.

b) Clasificar a los alumnos en función del índice anteriormente calculado.

c) Separa los casos en diferentes DataSet en función de su IMC.

El fichero Alumnos es,

DATA Alumnos;INPUT Nombre $ 9. Edad Nota Sexo $ Peso Altura;

DATALINES;

Manuel 16 6.8 M 78.5 180

Elena 13 6.2 F 56.9 175

Rosa 17 5.9 F 72.4 172

M. Flavia 18 7.0 F 60.3 165

Prudencio 14 5.9 M 79.1 171

Casimira 15 8.7 F 57.6 158

;PROC PRINT;RUN;

El índice de masa corporal (IMC) se calcula según la formula siguiente:

 

Según la OMS la clasificación primaria es:

IMC Clasificación

<18,50 Infrapeso

18,50 - 24,99 Normal

25 – 29,99 Sobrepeso

≥ 30 Obeso

Page 4: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 4/25

 

Statistical Analysis System DATA

-3 -

/* Creación, clasificación y separación en diferentes DataSet */ 

DATA Infra Normal Sobre Obeso;

SET Alumnos;

IMC = Peso/(Altura/100)**2;IF IMC < 18.5 THEN  DO;

Altura_m = Altura / 100;

OUTPUT Infra;END;

ELSE IF 18 <IMC < 24.9 THEN DO;Altura_m = Altura / 100;

OUTPUT Normal;

END;

ELSE IF 125 < = IMC < 30 THEN DO;Altura_m = Altura / 100;

OUTPUT Sobre;

END;

ELSE  DO;

Altura_m = Altura / 100;

OUTPUT Obeso;

END;

RUN; 

Sentencia: DO; sentencias END;

Ejemplo 4:

data dos;

set uno;

if edad<15 then do;edad=edad+7;

tasa=altura/edad;

end;

else do;

edad=edad-5;tasa=altura/edad -4;

end;

run;

Page 5: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 5/25

 

Statistical Analysis System DATA

-4 -

Sentencia if var in (val1, val2,...,valn) 

La sentencia if  var   in (val1, val2,...,valn ) es una forma abreviada de la sentencia If-

then-else completa. Su sintaxis es:

if var  in (val1, val2,...,valn )

donde,

var  es una variable

val1, …, valn  son los posibles valores que puede tomar.

La condición es cierta si la variable var  toma alguno de los valores de la lista

val1,…,valn  y falsa si no toma ninguno de ellos. Si la variable es alfanumérica los

valores se escriben entre comillas.

Ejemplo 5: Trabajando con el fichero 'Work.Campamento', seleccionar los casos

masculinos.

DATA Campamento;INPUT Nombre $ 9. Edad Nota Sexo $;

DATALINES;

Manuel 16 6.8 M

Elena 13 6.2 F

Rosa 17 5.9 F

M. Flavia 18 7.0 F

Prudencio 14 5.9 M

Casimira 15 8.7 F;

PROC PRINT;RUN;

/* Realizamos la selección*/ 

DATA Masculino;

SET Campamento;

If Sexo IN ('M'); /* Como la variable es alfanumérica los valores van

entre comillas */

PROC PRINT DATA = Masculino;

Title 'Solo hombres';

RUN;

Ejemplo 6: Conservar los datos de individuos que no sean ingleses ni franceses

data datos2;

set datos;

if pais in ('inglat', 'francia') then delete;

run;

Page 6: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 6/25

 

Statistical Analysis System DATA

-5 -

Sentencia IF expresion; 

Hace que el programa sólo continúe procesando las observaciones que cumplan la

expresión. Si la observación no la cumple, en control pasa a la línea posterior a data,

sin grabarla en el archivo de salida.

data uno;

set dos;

if edad<15;

output;

run;

Sentencia SELECT.

SELECT (expresión);  

WHEN (expresión) sentencias;  

...

OTHERWISE sentencias;  

END;

La expresión no es una condición, sino una fórmula que da lugar a un valor (numérico

o alfanumérico).

Modo de proceder:

Se evalúa la expresión del primer  WHEN. Si da el mismo resultado que la

expresión del SELECT, se ejecutan las sentencias correspondientes (incluyen

DO;END). Si no, se pasa al siguiente WHEN.

Si en ninguno de los WHEN coincide el valor de su expresión con el de la

expresión de SELECT se ejecutan las sentencias del OTHERWISE.

Si en este caso no se ha puesto OTHERWISE da error. Es conveniente, pues,

poner siempre OTHERWISE;

Ejemplo 7: Tenemos un archivo con el año, ingresos y gastos de una institución

sospechosa de corrupción.

Queremos repartir en distintos archivos las observaciones que provienen de

años diferentes. El año de las obs. viene en la variable tiempo, en el archivo uno.

data anterio period1 period2 period3 period4 period5;

set uno;

select (tiempo);

when (1989) output period1;

Page 7: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 7/25

 

Statistical Analysis System DATA

-6 -

when (1990) output period2;when (1991) output period3;when (1992) output period4;

when (1993) output period5;

otherwise output anterio;

end;

run;

Se pueden anidar los SELECT. Si en el ejemplo anterior queremos distribuir también

según los meses:

Ejemplo 7:

data ant per1mes1 per1mes2...;

set uno;

select (tiempo);

when (1989) do;

select (mes);

when ('enero') output per1mes1;

when... ... 

otherwise;

end;

when... 

... 

otherwise output ant;

end;

Page 8: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 8/25

 

Statistical Analysis System DATA

-7 -

Ejemplo 8:

** A partir de un grupo de variables crea una variable dummy **; 

data classdata;

input seccion puntos @@;

seccion1 = 0; seccion2 = 0; seccion3 = 0; seccion4 = 0;

select (section);when (1) seccion1 = 1;when (2) seccion2 = 1;when (3) seccion3 = 1;when (4) seccion4 = 1;

otherwise put seccion=;

end;

datalines;

1 58 1 36 1 87 1 78 1 89 1 67

2 76 2 94 2 64 2 84 2 96 2 47

3 75 3 74 3 86 3 91 3 76 3 84

4 81 4 67 4 97 4 31 4 89 4 67

;

 proc  print data=classdata;run;

Page 9: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 9/25

 

Statistical Analysis System DATA

-8 -

Ejemplo 9: Clasificar los resultados de un conjunto de alumnos.

data grades;

input id section score @@;

if score ge 90 then grade = "A";else if score ge 80 then grade = "B";

else if score ge 70 then grade = "C";

else if grade ge 60 then grade = "D";

else if score ne . then grade = "F";

select;

when (score ge 93) plusminus = "A";

when (score ge 90) plusminus = "A-";

when (score ge 88) plusminus = "B+";

when (score ge 83) plusminus = "B";

when (score ge 80) plusminus = "B-";

when (score ge 78) plusminus = "C+";

when (score ge73) plusminus = "C";

when (score ge 70) plusminus = "C-";

when (score ge 68) plusminus = "D+";

when (score ge 63) plusminus = "D";

when (score ge 60) plusminus = "D-";

when (score ne . ) plusminus = "F";

otherwise;

end;

label id = "Student ID number" 

section = "Class section number" 

score = "Exam score" 

grade = "Traditional grade" 

plusminus = "Plus/Minus grade" 

;

datalines;

811 1 85 138 1 95 137 1 75 642 1 94 134 1 88 466 1 84 258 1 36 733 1

86 844 1 69

131 2 84 336 2 76 541 2 79 951 2 79 348 2 94 846 2 64 187 2 96 976 2

68 199 2 46

879 3 54 796 3 97 872 3 94 647 3 99 994 3 46 884 3 86 946 3 76 465 3

79 944 3 84

;

 proc sort data=grades;

by section plusminus;

 proc  print data=grades;

by section;

id section;

run;

Page 10: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 10/25

 

Statistical Analysis System DATA

-9 -

7.2. Bucles

En SAS podemos encontrar tres tipos de bucles:

1. DO – BY – END. Bucle iteractivo

2. DO WHILE – END. Bucle con expresión mientras.

3. DO UNTIL – END. Bucle con expression hasta.

Sentencia DO-BY-END 

DO indice =ini  TO fin  BY incremento ;

Sentencia 1;

Sentencia 2;

………….. ;

END;

Repite las instrucciones entre la sentencia DO y la sentencia END tantas veces como

valores toma el índice (desde ini hasta fin , con los incrementos solicitados).

Ejemplo 1: Escribe 5 veces ‘Hola’ en la ventana LOG. 

DATA;

DO i=1 TO 5;

PUT 'HOLA';

END;

Ejemplo 2: Sumar los números impares del 1 al 13.

DATA;

suma=0;

DO i=1 TO 13 BY 2;

suma=suma+i;

END;

Observación-Si se quieren sumar los números 2,5,9,18, se podría escribir:

DATA;

suma=0;

DO i=2,5,9,18;

suma=suma+i;

End;

Observación -Si se quieren ejecutar ciertas sentencias para varios valores de la var.

mes:

DO mes='enero', 'febrero','abril'; 

Page 11: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 11/25

 

Statistical Analysis System DATA

-10 -

Observación - Se pueden combinar los dos formatos:

DO cuenta=3 to 5,8,17,20 to 26 by 2;

Ejecutaría las sentencias antes del END para los valores de

cuenta 3,4,5,8,17,20,22,24,26.

Observación - Se pueden cambiar los valores de la var. índice dentro del DO para

finalizarlo:

data uno;

input x @@;

put 'leo observación nº' _N_x=;

stop=10;suma=0;do i=1 to stop;

suma=suma+i*x;

put i= suma=;

if suma>20 then i=stop;

end;

cards;

3 4 7

;

Escribe:

leo obs nº1 X=3

I=1 SUMA=3

I=2 SUMA=9

I=3 SUMA=18

I=4 SUMA=30

leo obs nº2 X=4

I=1 SUMA=4

I=2 SUMA=12

I=3 SUMA=24

leo obs nº3 X=7

I=1 SUMA=7

I=2 SUMA=21

Observación -Se pueden anidar bucles:DATA uno;

DO i=1 TO 3;DO j=1 TO 4;

OUTPUT;

END;

END

;

Crearía 12 observaciones en el archivo uno:

i=1 j=1

i=1 j=2

...

Page 12: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 12/25

 

Statistical Analysis System DATA

-11 -

Ejemplo 3:

Creación de una tabla probabilística (Tabla de la distribución de Poisson)

 

data;

/* CABECERA */ 

put / @10 'TABLA DE PROBABILIDADES ACUMULADAS PARA

POISSON(LAMBDA)';

do i=1 to 78;

put '-' @;

end;

put;

put @35 'LAMBDA';

do i=1 to 78;

put '-' @;

end;

put;

put 'k' @3 @;

do i=0.1 to 1.5 by 0.1;

put i 4.1 +1 @;

end;

put;

do i=1 to 78;

put '-' @;

end;

/* CREACION DE LA TABLA */ 

do k=0 to 7;

put / k @;

do lambda=0.1 to 1.5 by 0.1;

pro=poisson(lambda,k);

put pro 4.3 +1 @;

end;

end;

Page 13: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 13/25

 

Statistical Analysis System DATA

-12 -

RESULTADO

TABLA DE PROBABILIDADES ACUMULADAS PARA POISSON(LAMBDA)

------------------------------------------------------------------------------

LAMBDA

------------------------------------------------------------------------------

k 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5------------------------------------------------------------------------------

0 .905 .819 .741 .670 .607 .549 .497 .449 .407 .368 .333 .301 .273 .247 .223

1 .995 .982 .963 .938 .910 .878 .844 .809 .772 .736 .699 .663 .627 .592 .558

2 1.00 .999 .996 .992 .986 .977 .966 .953 .937 .920 .900 .879 .857 .833 .809

3 1.00 1.00 1.00 .999 .998 .997 .994 .991 .987 .981 .974 .966 .957 .946 .934

4 1.00 1.00 1.00 1.00 1.00 1.00 .999 .999 .998 .996 .995 .992 .989 .986 .981

5 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 .999 .999 .998 .998 .997 .996

6 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 .999 .999

7 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00

NOTE: The data set WORK.DATA1 has 1 observations and 4 variables.

NOTE: At least one W.D format was too small for the number to be printed. The decimal

may be

shifted by the "BEST" format.

NOTE: DATA statement used:

real time 1:13.54 

Page 14: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 14/25

 

Statistical Analysis System DATA

-13 -

Ejemplos 4: Suma incorrecta. Variable macro.

%Let incremento = 0.000001; /*6 ceros 7 ceros 8 ceros*/ 

DATA ;

x = &incremento;

suma = 0;k = 0;DO i = 1 to (1/&incremento);

suma = suma + x;

end;

put suma=;

y = 1/&incremento;

put y=;

run; 

Sentencia DO WHILE 

DO WHILE (expresión );END;

donde expresión es una condición, y puede contener expresiones matemáticas, los

símbolos <, >, <>, <=, >=, AND, OR, etc.

La sentencia realiza las instrucciones anteriores a END; mientras se cumpla la

expresión del paréntesis:

DATA ;

n=0;

do while(n < 5);

put n=;n=n+1;

end;

Sentencia DO UNTIL

DO UNTIL (expresión) ;END;

Ejecuta las instrucciones anteriores a END hasta que se cumpla la expresión.

Lo anterior es equivalente a:

data;

n=0;

do until(n >= 5);

put n=;

n=n+1;

end;

Se pueden combinar varios formatos de DO:

data;suma=0;do i=1 to 10 by .5 while(suma < 8.5);

suma=suma+i;

Page 15: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 15/25

 

Statistical Analysis System DATA

-14 -

put suma=;

end;

run;

Pone:

suma=1

suma=2.5suma=7

suma=10

Page 16: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 16/25

 

Statistical Analysis System DATA

-15 -

7.3. Simulación de un archivo SAS

Una de las aplicaciones más inmediatas de los bucles es la simulación un archivo con

valores de variables aleatorias. Para ello, se crean bucles de tamaño igual al número

de observaciones del archivo que se quiere crear y a medida que se generan losvalores de las variables, se graban en el archivo de salida con la orden OUTPUT. 

Ejemplo 5:

Crear un archivo SAS donde estén las variables X1=N(2,2) y

X2=Gamma(a,p)=Gamma(2,5), con 20 observaciones:

data ejemplo;

do i=1 to 20;X1=sqrt(2)*rannor(i)+2;X2=5*rangam(i,2);

output;

end;

run;

Si se hubiera puesto erróneamente el OUTPUT fuera del bucle, sólo se hubiese grabado

en el archivo una observación.

Obtención de una muestra aleatoria 

En esta sección utilizaremos un ejemplo de obtención de muestras aleatorias para

introducir la sentencia SET – POINT que permite un acceso directo a un caso

determinado de un dataset.

La opción SET  archivo  POINT=i trae a memoria sólo la observación nº i del

archivo en cuestión.

Dándole valores a i iremos leyendo las diferentes observaciones que nos interesan:

Para realizar el ejemplo, primero creamos un dataset que contenga el conjunto de

datos de los que obtendremos una muestra aleatoria sin remplazamiento.

Creamos un DataSet para realizar el ejemplo.

DATA ejemplo;DO id=1 TO 10000;importe=ranuni(8)*1000; OUTPUT;

END;

RUN;

Page 17: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 17/25

 

Statistical Analysis System DATA

-16 -

Método simple de extracción de muestras aleatorias con reemplazamiento 

Para extraer una muestra aleatoria de 10 observaciones del archivo uno que tiene 30

observaciones, generamos 10 veces (mediante una uniforme discreta) valores enteros

entre 1 y 10000. Cada número generado será el número de la observación a leer con

SET - POINT del archivo en cuestión.

Ejemplo 1:

data dos;

do i=1 to 10;nume=int(10000*ranuni(i)+1);

set ejemplo point=nume;

output;

end;

stop;

Hemos extraído una muestra con reemplazamiento : Una misma observación puede

ser leída dos veces. El siguiente método permite extraer muestras aleatorias sin

reemplazamiento .

Método simple de extracción de muestras aleatorias sin reemplazamiento 

Se añade al archivo en cuestión una variable generada (uniforme, por ejemplo).

Se ordena el archivo mediante esta variable (PROC SORT). Esta ordenación es por lo

tanto aleatoria.

Se toman las 10 primeras observaciones del archivo. Esta será una muestra aleatoria.

Ejemplo 1: Obtener una muestra aleatoria de tamaño 10 del fichero ‘WORK.ejemplo’.

DATA dos ;

SET ejemplo ;

nume=int(10000*ranuni(i)+1);

PROC SORT DATA=dos;BY nume ;

DATA tres ;SET dos ;

IF n >10 THEN STOP ;

RUN ;

El único problema de este método es que requiere mucho tiempo de proceso en

archivos grandes, al tener que ordenar el archivo.

Ejemplo 2: Obtener una muestra aleatoria de tamaño 100, 200 Y 333 del fichero

‘WORK.ejemplo’.

Page 18: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 18/25

 

Statistical Analysis System DATA

-17 -

En este segundo ejemplo nos piden obtener muestras aleatorias de diferentes

tamaños. Para simplificar la programación utilizaremos una macro variable:

* Definición de la macro-variable ; 

%LET tamayo = 100;

DATA tres ;

SET ejemplo ;

IF n > &tamayo THEN STOP ;

RUN ;

Page 19: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 19/25

 

Statistical Analysis System DATA

-18 -

7.4. Arrays

El concepto de ‘array’ en SAS es diferente al concepto matemático. En SAS, un array

es un conjunto de variables que se agrupan y a las cuales se les asigna un nombre

como referencia lo que permite el uso de índices para referirse a ellas. A las variablesque constituyen el array se las llama elementos del array. A cada elemento del array

se le asocia un índice cuyo valor representa la posición del elemento en el array.

La estructura array permite realizar,

- Cálculos repetitivos

- Crear variables

- Leer datos

- Realizar comparaciones entre varias variables.

Es importante señalar que un array es un grupo de variables. Por lo tanto, para cada

observación diferente, los elementos del array tendrán diferentes valores.

Ejemplo 1: Cambio de ml a litros

Tenemos una serie de datos mensuales de precipitaciones en ml y queremos

expresarlos en litros, para ello hay que dividir cada dato de precipitación entre mil.

Con arrays sería así,

DATA Precipitaciones;INPUT anyo $ 1-10 Mes1-Mes12;

DATALINES;1989/1990 28.00 135.00 108.00 53.00 18.00 17.00 75.00 37.00 29.00 13.00 18.00 29.00

1990/1991 102.00 65.00 50.00 53.00 64.00 75.00 51.00 33.00 16.00 20.00 11.00 62.00

1991/1992 63.00 62.00 26.00 15.00 29.00 37.00 37.00 42.00 85.00 14.00 42.00 46.00

1992/1993 109.00 28.00 55.00 12.00 34.00 32.00 67.00 72.00 37.00 13.00 28.00 55.00

1993/1994 106.00 51.00 37.00 52.00 51.00 10.00 44.00 60.00 15.00 10.00 11.00 58.00

1994/1995 75.00 50.00 43.00 45.00 47.00 28.00 25.00 32.00 29.00 18.00 22.00 39.00

1995/1996 22.60 82.50 129.10 135.20 57.20 45.50 38.30 72.50 17.90 21.30 31.30 52.70

1996/1997 36.60 99.60 143.80 106.80 11.40 3.50 36.70 68.00 54.90 39.40 40.50 41.30

1997/1998 45.60 138.10 99.90 52.30 29.30 19.80 75.70 67.40 17.30 10.30 16.80 55.00

1998/1999 37.70 35.30 49.60 43.20 27.00 54.10 43.30 43.30 19.40 20.70 15.40 71.10

1999/2000 89.10 43.20 46.60 20.50 11.20 30.30 97.90 52.30 17.60 20.50 15.70 29.20

2000/2001 88.40 96.00 101.20 86.30 33.10 93.30 24.90 37.10 9.90 33.50 17.50 43.00

2001/2002 67.30 41.90 27.40 38.10 24.60 47.40 52.80 62.50 35.90 15.50 38.80 42.30

2002/2003 75.70 93.10 72.70 71.20 59.30 38.40 50.20 42.60 17.60 14.00 20.50 39.40

2003/2004 114.70 83.70 65.00 39.40 52.20 66.50 58.60 63.80 16.90 14.50 29.30 32.60

2004/2005 83.10 37.10 50.20 12.90 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

;

PROC PRINT DATA = Precipitaciones;

RUN;DATA litros;

SET Precipitaciones;

ARRAY litros {12} Mes1-Mes12;DO i = 1 to 12;

litros {i} = litros {i}/1000;

END;

PROC PRINT DATA=litros;RUN;

Page 20: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 20/25

 

Statistical Analysis System DATA

-19 -

Ejemplo 2:

Supongamos tenemos el archivo SAS uno, y nos interesa dar valor 0 a los valores

negativos de las variables a, b y c, en todas las observaciones. Para ello :

Creamos un array con las variables a, b, c : a =x{1}, b=x{2}, c=x{3}.

Realizamos un bucle en el que i vaya de 1 a 3, y dentro del cual se realiza la operación

mencionada con una variable cada vez.

Este proceso se repetirá tantas veces como observaciones haya en el archivo

tratado.

El programa sería :

DATA dos ;

ARRAY x{3} a b c ;SET uno ;

DO i=1 TO 3 ;

if x{i}<0 THEN x{i}=0 ;

END ;

RUN ;

Sentencia ARRAY 

 Agrupa variables en un vector.

Cada elemento del array es una variable (columna de datos).

Sintaxis 1:

 ARRAY nombre [$] elementos (valores iniciales);

Cada variable del ARRAY se llamará nombre{1},...nombre{i}, donde i es la posición

que ocupa, en el transcurso del bloque data actual. Sin embargo estos elementos del

array tomarán como nombres los nombres de los elementos a efectos de grabar en

archivo de salida y de escribirse en el LOG.

Ejemplo 3:

DATA ;

INPUT a b c;

ARRAY todos a b c;

DO i=1 TO 3;IF todos{i}<4 THEN PUT todos{i}=;

END;

CARDS;

2 3 6

1 2 5

3 5 2

4 0 9

Page 21: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 21/25

 

Statistical Analysis System DATA

-20 -

5 10 23

1 3 4

;

RUN;

Escribe en LOG:

a=2

b=3

a=1

b=2

a=3

c=2

b=0

a=1

b=3

Notas:

-  Si las variables del ARRAY son alfanuméricas se pondrá el

$.-  Si se les quiere dar valores iniciales se ponen entre

paréntesis.

Sintaxis 3:

 ARRAY nombre {n} variables (val.iniciales);

donde n indica la dimensión del vector.

Si se están creando las variables y no se les da nombre, adquieren

nombre1...nombren:

Ejemplo 4:

DATA uno;ARRAY hola{4} (2 4 6 7);DO i=1 TO 4;

hola{i}=hola{i}*i;

PUT hola{i}=; OUTPUT;

END;

RUN;

escribe en LOG:

hola1=2hola2=8

hola3=18

hola4=28

y el archivo uno tendrá los datos:

obs hola1 hola2 hola3 hola4 i

1 2 4 6 7 1

2 2 8 6 7 2

3 2 8 18 7 3

4 2 8 18 28 4

Page 22: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 22/25

 

Statistical Analysis System DATA

-21 -

ARRAY multidimensional: 

 ARRAY {n1,n2,...} variables (valores iniciales);  

El orden de las variables creadas o existentes referentes a los referentes a los

elementos del array es de derecha a izquierda según esos elementos, y se verá acontinuación.

Ejemplo 1:

array vari{2,3} x1-x6;

el array contendría los siguientes elementos:

vari{1,1} vari{1,2} vari{1,3} x1 x2 x3

vari{2,1} vari{2,2} vari{2,3} x4 x5 x6

Ejemplo 2

La utilidad del array multidimensional está en ordenar las variables según dimensiones

que tengan sentido en un conjunto de datos determinado. En el siguiente ejemplo, hay

dos ciudades (dimensión 1) con 5 medidas de temperatura cada una (dimensión 2).

Los datos de los que se disponen son las temperaturas de dos ciudades tomadas en

cinco instantes diferentes. Estas temperaturas están medidas en grados Farenheit. Se

desea transformar las temperaturas de grados Farenheit a Celsius, para lo cual seorganizan las variables en un array bidimensional. Aunque se podría utilizar un array

unidimensional también para esa operación, la estructura del array bidimensional es

más apropiada en cuanto a leer los datos y tenerlos guardados con una estructura que

permita operar con estas variables en pasos DATA posteriores.

/*******************************/  

/* Con un ARRAY bidimensional */ 

/*******************************/  

DATA temperatura (drop=i j);ARRAY temp{2,5} c1t1-c1t5 c2t1-c2t5;

INPUT c1t1-c1t5 / c2t1-c2t5;

DO i=1 TO 2;DO j=1 TO 5;

temp{i,j}=(temp{i,j}-32)/1.8;

END;

END;

DATALINES;

89.5 65.4 75.3 77.7 89.3

Page 23: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 23/25

 

Statistical Analysis System DATA

-22 -

73.7 87.3 89.9 98.2 35.6

75.8 82.1 98.2 93.5 67.7

101.3 86.5 59.2 35.6 75.7

;

PROC PRINT DATA=temperatura;

TITLE 'Temperatura de dos ciudades';RUN;

/*******************************/  

/* Con un ARRAY unidimensional */ 

/*******************************/  

DATA temperatura2 (drop=i );ARRAY medir {10} c1t1-c1t5 c2t1-c2t5;

INPUT c1t1-c1t5 / c2t1-c2t5;

DO i=1 TO 10;medir{i}=(medir{i}-32)/1.8;

END;DATALINES;

89.5 65.4 75.3 77.7 89.3

73.7 87.3 89.9 98.2 35.6

75.8 82.1 98.2 93.5 67.7

101.3 86.5 59.2 35.6 75.7

;

PROC PRINT DATA=temperatura2;

TITLE 'Temperatura de dos ciudades';

RUN;

En el ejemplo anterior no se ha hecho referencia al número de observaciones de las

variables. Al tratar con ficheros rectangulares, el número de observaciones es igual

para cada una de las variables del fichero de datos. Este número es una dimensión

más del array que conoce y por lo tanto SAS trabaja con ella por defecto.

Bucles en ARRAY 

 Además de los bucles que existen en el lenguaje de programación, SAS proporciona

un tipo de bucle especial para los arrays.

Sentencia DO OVER nombrearray ;END; 

Ejecuta las sentencias entre el DO y el END para cada elemento del array: No es

necesario llamar a los elementos del array nombre{1}... basta con referirse a ellos por 

el nombre.

Ejemplo 3:

data;

input x1-x3 @@;

Page 24: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 24/25

 

Statistical Analysis System DATA

-23 -

array g x1-x3;

do over g;

g=g*5;

put g=;

end;

cards;

3 4 7 1 2 4

;

run;

escribe:

x1=15

x2=20

x3=35

x1=5

x2=10

x3=20

Ejemplo 4: Queremos poner a missing los valores negativos de las variables x3, x4,

x5 del archivo uno.

DATA dos;

SET ejemplo;

ARRAY nuevas x3-x5;

DO OVER nuevas;

IF nuevas<0 THEN nuevas=.;

OUTPUT;

END;

RUN;

En total, las sentencias que se pueden utilizar para referirse a las variables de un

 ARRAY son:

DO WHILE,DO UNTIL,DO/TO/BY,IF,PUT,SELECT,INPUT.

Page 25: 2011 Paso DATA Cap 07 Control de Flujo

5/17/2018 2011 Paso DATA Cap 07 Control de Flujo - slidepdf.com

http://slidepdf.com/reader/full/2011-paso-data-cap-07-control-de-flujo 25/25

 

Statistical Analysis System DATA

-24 -

Ejemplo 5: La emisora de Radio $=PCP ha realizado una encuesta sobre 5

canciones. Las canciones son puntuadas del 1 al 5 , donde 1 = “Cambiar de emisora”

y 5 =”Subir le volumen”. Si el oyente no ha oído nunca la canción la puntúa con 9.

Los datos obtenidos son:

CiudadEd

adC1 C2 C3 C4 C5 C6 C7 C8 C9 C10

 Albany 54 4 3 5 9 9 2 1 4 4 9

Richmond 33 5 2 4 3 9 2 9 3 3 3

Oakland 27 1 3 2 9 9 9 3 4 2 3

Richmond 41 4 3 5 5 5 2 9 4 5 5

Berkeley 18 3 4 9 1 4 9 3 9 3 2