BookmarkSubscribeRSS Feed
Tip Semanal 026: Leer filas de forma diferente
Berenice25
SAS Employee

El Paso Data (Data Step en inglés) lee las filas de una tabla en forma secuencial, comenzando en la primera fila y terminando en la última. 
Sí, claro... esto es evidente. 
Pero a veces necesitamos leer la información en un orden específico.

Es por eso que en este Tip les mostramos cómo leer las filas de una tabla de dos formas diferentes.

Esperamos que les sea de utilidad.

 

/****************************************************************************/
/* Usamos el Paso Data para para leer filas de un conjunto de datos (o de 	*/
/* una tabla, como prefieran) en un orden específico.		  				*/
/* En primer lugar leeremos una fila cada 'n'. Lo que en estadística llaman	*/
/* muestreo dirigido.														*/
/* En segundo y último lugar, vamos a leer una tabla en un orden totalmente */
/* inesperado: ¡al revés!													*/
/* Y, si se preguntan para qué puede servir leer una tabla de esa manera,	*/
/* tendrán que esperar al siguiente Tip para ver una aplicación	clásica.	*/
/* ¡Esperamos que puedan resistir la incertidumbre!							*/
/****************************************************************************/


/*-------------------*/
/* inicio del código */
/*-------------------*/


/*------------------------------*/
/* Primera parte:	 			*/
/* La función 'MOD'				*/
/*------------------------------*/

/*------------------------------------------------------------------------------------------*/
/* La función 'Mod' devuelve el resto de la división de un número (el primer argumento de 	*/
/* la función) por otro (el segundo argumento de la función)								*/
/*------------------------------------------------------------------------------------------*/

/* Ejemplos: 														*/
/* mod(10,2) es igual a 0 (porque el resto de dividir 10 por 2 es 0)*/
/* mod(23,2) es igual a 1 (porque el resto de dividir 23 por 2 es 1)*/
/* mod(23,5) es igual a 3 (porque el resto de dividir 23 por 5 es 3)*/

/* Con todo el conocimiento recién adquirido, vamos a usar esta función para elegir filas	*/ 
/* de una tabla																				*/												

/*----------------------------------------------*/
/* Ejemplo 1_1: solamente las filas pares		*/
/*----------------------------------------------*/

data zapatillas_par;
set sashelp.shoes;
obs_original = _n_;
if mod(_n_,2) = 0 then output;
run;


/*----------------------------------------------*/
/* Ejemplo 1_2: solamente las filas impares		*/
/*----------------------------------------------*/

data zapatillas_impar;
set sashelp.shoes;
obs_original = _n_;
if mod(_n_,2) = 1 then output;
run;


/*--------------------------------------------------------------*/
/* Ejemplo 1_3: Lee solamente las filas que son múltiplos de 5	*/
/*--------------------------------------------------------------*/

data zapatillas_mult_5;
set sashelp.shoes;
obs_original = _n_;
if mod(_n_,5) = 0 then output;
run;

/* En estos ejemplos hemos utilizado '_n_'. Hay que tener en cuenta que este valor en realidad	*/
/* no es el número de fila, sino que cuenta el número de ciclos que hace el Paso Data. 			*/								
/* En nuestra situación lo podemos utilizar sin inconvenientes porque estamos leyendo una fila 	*/
/* en cada ciclo del Paso Data, por lo que coinciden. 											*/
/* Sí, claro... Por supuesto... se puede usar el Paso Data para leer o para generar más de una 	*/
/* fila en cada ciclo de este (¡del Paso Data!), cosa que tal vez presentemos en un futuro Tip 	*/



/*------------------------------*/
/* Segunda parte:	 			*/
/* Leer una tabla 'al revés'	*/
/*------------------------------*/

/*----------------------------------------------------------------------------------*/
/* Ejemplo 2: Lee comenzando en la última fila, retrocediendo hasta la primera fila	*/
/*----------------------------------------------------------------------------------*/

data zapatillas_al_reves;
	/* comienzo del "ciclo" (loop) que lee filas desde el final */
	do k = nro_obs to 1 by -1;  /* va leyendo filas retrocediendo de a una, desde 'nro_obs' 
								hasta la primera fila */
		set sashelp.shoes nobs=nro_obs point=k;  /* la variable 'nro_obs' tiene guardada la 
													cantidad de sashelp.shoes */
		obs_original = k;
		output;
	end;  
	/* final del "ciclo" */
	stop;  /* la sentencia 'stop;' está "por las dudas"; cosa muy pero muy recomendable cuando se  
			utiliza un DO..END como lo estamos haciendo */
run;



/*----------------*/
/* fin del código */
/*----------------*/

Si has entendido cómo funciona el segundo ejemplo, tenemos una pregunta para plantearte:
¿Cuál será el valor de _n_ al ejecutar (o correr) este código? 
Tengan en cuenta que comentamos el significado de '_n_' más arriba.

 

 

 

3 Comments
Fibaa
Calcite | Level 5

Muy bueno!

OctBF
Calcite | Level 5

Una locura eso de leer al revés

Norma_Mussari65
Fluorite | Level 6

muy bueno

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
Article Labels
Article Tags
Contributors