Tip Semanal 028: Funciones de SAS (parte 1 - alfanuméricas)
Posted 08-29-2022 03:05 PM
(3907 views)
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 */
/*-------------------*/
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.