Consejos y trucos

BookmarkSubscribeRSS Feed
Tip Semanal 028: Funciones de SAS (parte 1 - alfanuméricas)
Berenice25
SAS Employee

Las funciones de SAS permiten aumentar la potencia de nuestros códigos.

Es por esta razón que vamos a presentar algunas de ellas. Solamente algunas, porque hay alrededor de 200! 
Esta será la primera parte de funciones, en la que veremos algunas de las "clásicas" que se utilizan para variables alfanuméricas. Seguramente les serán de utilidad. 
Si quieren acceder al listado completo de funciones de SAS, vayan al siguiente link: https://documentation.sas.com/doc/es/pgmsascdc/9.4_3.5/allprodsle/syntaxByType-function.htm 

Recuerden: para SAS variables=columnas=campos 

 

/************************************************************************/
/* 								  										*/
/* 				Funciones de SAS (parte 1 - alfanuméricas)				*/
/* 							  											*/
/************************************************************************/


/************************************************************************/
/*																		*/
/* Para hablar de funciones, vamos a distinguirlas según el tipo de		*/
/* variables a las que se aplican. Entonces tenemos:					*/
/* 	1. Funciones alfanuméricas											*/
/* 	2. Funciones numéricas												*/
/* 	3. Otras funciones 													*/
/* 																		*/
/* Dentro de las funciones numéricas podemos ver funciones estadísticas,*/
/* de redondeo y truncamiento, de fecha, y demás. 						*/
/* Dentro del grupo 3 podemos incluir las que modifican el tipo de		*/
/* variable, las que combinan variables numéricas y alfanuméricas, y 	*/
/* demás.																*/
/* 																		*/
/* Esta es tan sola una de las formas de clasificar las funciones. Lo	*/
/* hacemos así para poder presentar mejor los ejemplos.					*/
/*																		*/
/************************************************************************/

/************************************************************************/
/*																		*/
/* En la parte 1 de nuestros Tips de funciones hablaremos de primer 	*/
/* grupo: el de las	funciones alfanuméricas.							*/
/* Antes de comenzar, es buenos recordar que para SAS las 'variables	*/
/* caracter (character)' son sinónimo de variables alfanuméricas. 		*/
/*																		*/
/************************************************************************/



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


/************************************/
/* 	1. Funciones alfanuméricas		*/
/************************************/


/*--------------------------------------*/
/* Ejemplo 1.1:  						*/
/* Funciones UPCASE, LOWCASE y PROPCASE */
/*--------------------------------------*/

/* Estas funciones premiten pasar texto a mayúsculas, minúsculas o iniciar	*/ 
/* en mayúscula y continuar con minúsculas. Veamos el ejemplo:				*/

data ej11_nombres;
	input Nombre $15.;
	Mayusc = upcase(Nombre);
	Minusc = lowcase(Nombre);
	May_minusc = propcase(Nombre);
	datalines;
Manuel vega
VAleriA PEREZ
;
run;

/* El resultado es: */
/*
---------------------------------------------------------------
Nombre 			Mayusc 			Minusc 			May_minusc		
Manuel vega 	MANUEL VEGA 	manuel vega		Manuel Vega		
VAleriA PEREZ	VALERIA PEREZ	valeria perez	Valeria Perez	
---------------------------------------------------------------
*/



/*------------------------------*/
/* Ejemplos 1.2:  				*/
/* Función SUBSTR 				*/
/*------------------------------*/

/* La función SUBSTR se utiliza para extraer subcadenas de un texto */ 
/* substr(data, a, n) donde: 										*/					
/* --> data: puede ser una constante o una variable (alfanumérica, 	*/
/* desde ya)														*/
/* --> a: posición													*/
/* --> n: cantidad de caracteres									*/

data ej12_prueba;
	length Nombre $20. Telefono $14.;
	infile datalines delimiter='/';
	input Nombre $ Telefono $;
	Nombre_1=substr(nombre, 1, 4);  /*extrae los primeros 4 caracteres*/
	Nombre_2=substr(nombre, 2);  /*extrae todo a partir del segundo caracter*/
	Nombre_3=substr(nombre,length(nombre)-1,2);  /*extrae los 2 últimos caracteres*/
	Telefono_1=substr(telefono,6);  /*extrae todo a partir del sexto caracter*/
	Telefono_2=substr(telefono,9,1);  /*extrae el caracter de la posición 
										9 (¡el guión!)*/
	datalines;
Manuel Vega/(312)555-1212
Valeria Perez/(011)696-3456
;
run;

/* Y el resultado es el siguiente: */
/* 
----------------------------------------------------------------------------------
Nombre		 Telefono	    Nombre_1 Nombre_2     Nombre_3	Telefono_1	Telefono_2	
Manuel Vega	 (312)555-1212	Manu 	 anuel  Vega  ga	    555-1212	-			
Valeria Perez (011)696-3456	Vale 	 aleria Perez ez	    696-3456	-			
----------------------------------------------------------------------------------
*/



/*------------------------------*/
/* Ejemplo 1.3:  				*/
/* Función SCAN 				*/
/*------------------------------*/

/* La función SCAN extrae una 'palabra' de una expresión alfanumérica. En 	*/
/* realidad esta 'palabra' es una subcadena de caracteres. 					*/
/* ¿Cómo lo hace? Separando la expresión alfanumérica por un conjunto de 	*/
/* delimitadores especificados. 											*/
/* Si los delimitares no se especifican, entonces utilizará los 			*/	
/* predeterminados. La lista de delimitadores predeterminados es:			*/
/* espacio (blank) ! $ % & ( ) * + , - . / ; < ^ |  						*/

/* La función SCAN tiene la siguiente sintaxis:						*/ 
/* scan(data, a, n) donde: 											*/					
/* --> data: puede ser una constante o una variable alfanumérica 	*/
/* --> a: número de la palabra; si es negativo comienza desde la 	*/
/* derecha.															*/
/* --> n: lista de delimitadores seleccionados.						*/
/* Atención: también existen modificadores de la función. Los 		*/
/* pueden buscar en el Help (la url figura en la introducción).		*/

data ej13_prueba;
	length Nombre $20. Telefono $14. Mail $30. 
		   Nombre_solam $20. Apellido_solam $20.;
	infile datalines delimiter='/';
	input Nombre $ Telefono $  Mail $;
	Nombre_solam= scan(Nombre,1);
	Apellido_solam= scan(Nombre,2);
	Mail_1=scan(mail,1);
	Mail_2=scan(mail,1,'@'); /* solamente considera el '@' como delimitador */
	Mail_3=scan(mail,2); /* '@' no está en la lista de delimitadores */
	Mail_4=scan(mail,-2,'.@');  /* '-2' --> busca la segunda 'palabra' desde 
								el final; solamente considera el '.' o el '@' 
								como delimitadores */
	datalines;
Manuel Vega/(312)555-1212/mvega@myspace.edu
Valeria Perez/(011)696-3456/valeperez@aol.gob
;
run; 

/* Y aquí está el resultado: */
/* 
-----------------------------------------------------------------------------------------------------------------
Nombre		  Telefono	    Mail	          Nombre_solam Apellido_solam Mail_1		Mail_2	  Mail_3  Mail_4	
Manuel Vega	  (312)555-1212 mvega@myspace.edu Manuel	   Vega			  mvega@myspace mvega	  edu	  myspace	
Valeria Perez (011)696-3456 valeperez@aol.gob Valeria	   Perez		  valeperez@aol valeperez gob	  aol		
-----------------------------------------------------------------------------------------------------------------
*/



/*------------------------------*/
/* Ejemplo 1.4:  				*/
/* Funciones INDEX y FIND		*/
/*------------------------------*/

/* Las funciones INDEX y SCAN buscan una subcadena dentro de una cadena de 		*/
/* caracteres y devuelven la posición del primer caracter de esta subcadena. 	*/
/* Si estas funciones no encuentran la subcadena devuelven el valor 0 (cero) 	*/
/* La función INDEXC es una variante de la función INDEX. En vez de buscar una 	*/
/* subcadena, lo hace considerando una lista de caracteres. Los toma en forma 	*/
/* individual, no como un texto en conjunto. 									*/

/* Como la explicación suena un poco complicada, tal vez el ejemplo nos aclare 	*/
/* el panorama. 																*/

data ej14_index_find;
	length Nombre $30. Telefono $14.;
	infile datalines delimiter='/';
	input Nombre $ Telefono $;
	Casual_index=index(Nombre, 'an');
	Casual_find_1=find(Nombre, 'an');
	Casual_find_2=find(Nombre, 'An'); /*distingue 'an' de 'An'*/
	Casual_find_3=find(Nombre, 'An', 'I'); /*busca la primera aparición de 'An',  
											sin importar si está en mayúscula o en 
											minúscula */
	Casual_find_4=find(Nombre, 'an', 12, 'I'); /*comienza en la posición 12. 
											Modificador 'I' --> case insensitive*/
	Casual_indexc=indexc(Nombre, 'an'); /*busca la primera aparición de 'a' o 
										de 'n'*/
	datalines;
Manuel Andrés Vega/(312)555-1212
Valeria Candela Perez Andersen/(011)696-3456
;
run;

/* Y el resultado es: */
/* 
--------------------------------------------------------------------------------------------------------------------------------
Nombre						   Telefono	     Casual_index Casual_find_1 Casual_find_2 Casual_find_3 Casual_find_4 Casual_indexc
Manuel Andrés Vega			   (312)555-1212 			2	          2	            8	          2	            0	          2
Valeria Candela Perez Andersen (011)696-3456 		   10	         10	           23	         10	           23	          2
--------------------------------------------------------------------------------------------------------------------------------
*/

/* Mirando este ejemplo puede surgirles la siguiente pregunta (entre varias otras): 
¿pero entonces las funciones INDEX y FIND hacen lo mismo? Y, si la respuesta es 
afirmativa, ¿por qué dos funciones? */
/* Y... la respuesta es que SAS está disponible desde hace laaaargo tiempo; desde 
 mediados de los años '70. Lo que sucedió es que la función INDEX fue la 
 primera. Después apareció la función FIND como un mejora; tiene más variantes. */
/* Lo mismo sucedió con la función INDEXC, es otra mejora. Y sí, también es más 
 reciente que INDEX. */



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



sas-innovate-white.png

Missed SAS Innovate in Orlando?

Catch the best of SAS Innovate 2025 — anytime, anywhere. Stream powerful keynotes, real-world demos, and game-changing insights from the world’s leading data and AI minds.

 

Register now

Article Labels
Contributors