/**
Lectura y proceso por categorías
Si utilizamos la sentencia SET con la opción BY var, donde var es una lista de variables en
principio categóricas, las observaciones son leidas por orden de esas categorías.
Además, son creadas dos importantes variables EN EL LOG de sistema: FIRST.var y LAST.var que
toman valores respectivos 1 según estemos en la primera (para FIRST.var ) o última (para
LAST.var ) observación de cada grupo de la variable categórica. En el resto de observaciones
estas variables toman valor 0.
Estas variables no son guardadas como variables SAS, sino que sólo existen en el proceso
de lectura del archivo. Como siempre, si vamos a utilizar la opción BY deberemos
ordenar previamente el archivo por las variables del BY.
**/
data software.ejercicio1;
Input dni nombre$ sexo$ ;
cards;
5 JOSE h
7 MARIA m
9 MARTA m
8 ANA m
;
run;
data software.ejercicio2;
Input dni edad ;
cards;
7 25
5 30
9 32
10 22
6 18
;
run;
PROC SORT DATA=software.ejercicio1; BY dni;
PROC SORT DATA=SOFTWARE.ejercicio2; BY dni;
DATA SOFTWARE.UNION;
MERGE SOFTWARE.ejercicio1 (in=ej1) SOFTWARE.ejercicio2 (in=ej2); BY dni;
run;
data software.union2;
set software.union (where =(dni>6 and dni<9));
run;
data persona;
input nombre $ sexo $;
cards;
maria f
ana f
tomas m
;
data lugar;
input nombre $ ciudad $ region;
cards;
jose alava 5
maria malaga 2
maria orense 7

proc sort data=persona;by nombre;
proc sort data=clase.baloncesto;by puntosa;
/***
solo uno de cada observaci�n, no las repeticiones;
***/
data software.puntos_a;
set clase.baloncesto ;by puntosa ;
if (first.puntosa=1) then output ;
run;
/***
solo los que est�n sin repetir
***/
data software.puntos_a;
set clase.baloncesto ;by puntosa ;
if (first.puntosa=1 and last.puntosa=1) then output ;
run;
proc sort data=clase.baloncesto;by puntosa;
data software.puntos_a;
set clase.baloncesto (keep=puntosa) ;by puntosa ;
if (first.puntosa=1 and last.puntosa=1) then output ;
run;
/***
En uno los valores �nicos y en otro los repetidos en un solo paso data
***/
data software.uno software.dos;
set clase.baloncesto (keep= puntosa); by puntosa;
if (first.puntosa=1 and last.puntosa=1) then output software.uno ;
else output software.dos;
run;
/***
eliminamos las duplicidades
***/
proc sort data=software.dos out=software.dos_no_rep nodupkey; by puntosa;
run;