Aprende varias funciones útiles para manipular estructuras de datos, listas anidadas, expresiones regulares y trabajar con horas y fechas en el lenguaje de programación R.
En este tutorial vas a aprender varias funciones y utilidades sencillas y muy usadas en el lenguaje de programación R. Primero, veremos algunas funciones matemáticas. Después, exploraremos funciones relacionadas con las estructuras de datos de R, como la manipulación de listas anidadas, expresiones regulares, y el trabajo con horas y fechas.
Funciones matemáticas
Veamos las siguientes celdas de código que usan varias funciones matemáticas.
Primero defines dos vectores, x y y, que incluyen valores positivos y negativos.
La siguiente es la función round(). Su cometido es redondear la entrada. Acepta un argumento adicional para indicar a cuántos decimales quieres redondear. Por defecto, round() redondea a cero decimales.
Por ejemplo, tras aplicar round() a los vectores x y y, la salida sería la siguiente:
La función sum() calcula la suma de los elementos de un vector o matriz. Por ejemplo, si pasas un vector fila como argumento, devolverá un escalar con la suma de todos sus elementos.
En este caso, se pasan los vectores x y y a sum(). R calcula la suma de sus elementos y devuelve un escalar.
Por último, la función mean() (media) calcula la media aritmética: suma un conjunto de valores numéricos y los divide entre el número de términos.
En este caso, la entrada de mean() es un vector fila de longitud dos con los números 7 y 48. Por tanto, la media es la suma de ambos dividida entre el número de elementos, es decir, 2.
¡Pasemos al siguiente bloque, el más interesante del tutorial!
Funciones para estructuras de datos
Ahora veamos algunas estructuras de datos como listas y vectores. Verás distintas formas de operar con una list, invertir una list y cómo convertir una lista en vector y viceversa.
La siguiente función es una list(), o mejor dicho, una lista de listas (lista anidada). Crea una lista de elementos que puede incluir valores lógicos, numéricos y cadenas.
En el ejemplo siguiente hay tres listas dentro de una lista: log, ch e int_vec. Cada una tiene un tipo de dato u objeto de R: lógico, numérico y carácter/cadena.
list_define <-list(log = TRUE, ch ="hello_datacamp", int_vec = sort(rep(seq(8,2, by =-2), times =2)))Con la tecnología de
La función seq produce una secuencia de números en orden descendente del 8 al 2.
La sintaxis de seq() es: seq(x1,x2, by = y)
Los dos primeros argumentos, x1 y x2, indican a R el rango de la secuencia (inicio y fin). El argumento by especifica el incremento o decremento en cada paso.
Por ejemplo, la línea de abajo genera una secuencia de 100 a 200 con un paso de 20.
Puede repetir la entrada (normalmente un vector o lista) usando el argumento times, que recibe un entero e indica cuántas veces repetir la secuencia. rep acepta dos argumentos: la entrada y el número de repeticiones.
Aplicando rep a nuestro vector de longitud 4, obtenemos una salida de longitud 8.
Por último, sort(). Es una función genérica y autoexplicativa para ordenar estructuras como vectores o listas. No se limita a numéricos: también funciona con lógicos y caracteres. Por defecto, ordena en ascendente.
Pasemos la salida de rep a sort para obtener el resultado final.
Convirtamos la lista grande list_define a vector. Ojo: un vector solo puede contener un único tipo de dato u objeto de R. Por tanto, los valores logical y numeric se convertirán en cadenas.
List of 6$ log : logi TRUE$ ch : chr "hello_datacamp"$ int_vec: num [1:8]22446688$ log : logi TRUE$ ch : chr "hello_datacamp"$ int_vec: num [1:8]22446688Con la tecnología de
Por último, invirtamos el orden de list_define con rev() en R.
List of 3$ int_vec: num [1:8]22446688$ ch : chr "hello_datacamp"$ log : logi TRUECon la tecnología de
Expresiones regulares
Mucha gente ve las expresiones regulares como un tema complejo. Sin embargo, son esenciales no solo en R, sino en muchos lenguajes como Python. Muchos lenguajes, incluido R, traen soporte de regex integrado.
Las expresiones regulares tienen infinidad de aplicaciones y son muy útiles para preprocesar texto. Se usan en problemas de PLN (NLP).
También se emplean en motores de búsqueda y editores de texto.
Las expresiones regulares, también llamadas regex, regexp u operadores racionales, son una secuencia de caracteres que define un patrón de búsqueda. Estos patrones se usan para encontrar coincidencias, buscar y reemplazar o filtrar cadenas que encajan con el patrón.
Empecemos entendiendo grep() y grepl().
Para simplificar, definamos un vector fila animals_regex de longitud 5 sobre el que aplicaremos patrones regex.
Primero, grepl(). Esta función devuelve un lógico: TRUE si la cadena casa con el patrón, FALSE en caso contrario.
La sintaxis de grepl() es sencilla: el primer argumento es el patrón a buscar y el segundo es el vector/cadena donde buscar. Puedes ignorar el resto por ahora. grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) Averigüemos qué animales de los cinco anteriores tienen una c usando grepl().
En este caso buscas animales que contengan c, así que el patrón es simplemente c.
Como ves, hay c en cat, cheetah y mice, por eso esas posiciones del vector animals_regex devuelven TRUE, y FALSE en las que no coinciden con c.
Busquemos ahora los elementos que empiezan por c y no solo los que la contienen.
Para ello, usa el acento circunflejo ^ al inicio del patrón que quieres encontrar.
grepl(pattern ='^c', x = animals_regex)#solo cat y cheetah empiezan por `c`.Con la tecnología de
TRUE
FALSE
TRUE
FALSE
FALSE
Como solo cat y cheetah empiezan por c, solo esas posiciones son TRUE.
De forma similar a ^, el signo $ al final del patrón sirve para hacer coincidir elementos que terminan con dicho patrón. Para encontrar animales que terminan en n, usa n seguido de $.
grepl(pattern ='n$', x = animals_regex)#solo lion termina en `n`.Con la tecnología de
FALSE
FALSE
FALSE
TRUE
FALSE
Nota: Para saber más sobre expresiones regulares, escribe ?regex en una celda de Jupyter y se abrirá la documentación. También puedes consultar esta fuente, que ofrece una herramienta para diseñar y probar patrones sobre tus cadenas.
Similar a grepl(), grep() devuelve los índices del vector/matriz que coinciden con el patrón, en lugar de lógicos.
La sintaxis de grep() es la misma que la de grepl(): grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE). Tomemos el mismo ejemplo de arriba, pero aplicando grep().
Al igual que grepl(), grep() maneja distintos patrones de expresiones regulares.
Si aplicas grep() para encontrar elementos en el vector animals_regex que terminan en n, esperas la salida 4, ya que solo lion acaba en n, como se muestra:
Has aprendido lo básico de regex: cómo filtrar elementos de un vector que casan con un patrón. Pero R no se limita a buscar patrones. Tiene varias funciones útiles, entre ellas sub().
La función sub(), en lugar de filtrar, reemplaza las coincidencias por otras cadenas. ¡Veámosla!
sub() recibe principalmente tres argumentos:
pattern, el patrón o regex a buscar,
replacement, el valor que sustituirá la coincidencia, y
x, el vector de entrada sobre el que aplicas la regex.
La sintaxis es: sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE). Usemos de nuevo el ejemplo de arriba para entender cómo funciona.
Como ves, cat pasa a ser aat, cheetah se convierte en aheetah y mice en miae. En esas posiciones el patrón ha coincidido.
Ten en cuenta que sub() solo busca la primera coincidencia en cada cadena: si hay dos c, solo la primera se reemplaza por a; la segunda queda igual.
Si quieres reemplazar todas las coincidencias, usa gsub() (fuera del alcance de este tutorial).
Antes de pasar al siguiente tema, probemos una expresión más.
Ahora usaremos el operador | (o) para intentar casar cualquiera de los patrones definidos y, si coinciden, reemplazarlos por -. Recuerda: con gsub() se reemplaza cada coincidencia del patrón.
gsub(pattern ='c|d|l', replacement ='-', x = animals_regex)#los animales con `c`,`d`,`l` se reemplazan por `-`.Con la tecnología de
'-at'
'-og'
'-heetah'
'-ion'
'mi-e'
¡Pasemos al último tema de hoy: tiempo y fechas!
Tiempo y fechas
La información de fecha y hora puede ser muy útil en muchos casos. Por ejemplo, si trabajas en Visión por Computador y quieres calcular los FPS (frames por segundo) a los que corre tu algoritmo, puedes usar el objeto de tiempo para medir la velocidad de proceso. Para series temporales y análisis de estacionalidad, R despliega todo su potencial.
Para empezar, imprimamos la fecha de hoy en R con Sys.Date(). Sys hace referencia al sistema, es decir, devuelve la fecha del sistema.
Las fechas y horas en R pertenecen al objeto Date, es decir, el tipo de dato es Date. Puedes verificarlo con la función class que viste en el tutorial Data Types in R.
Similar a la fecha, tienes time() del sistema con Sys.time(), que devuelve hora y fecha actuales.
Un punto importante: la función as.Date en R espera por defecto el formato YYYY-MM-DD. Si intercambias año, mes o día, obtendrás un error. ¡Probemos!
date_may <-as.Date('05-1993-10')#R sigue por defecto el formato de fecha ISOCon la tecnología de
Error in charToDate(x): character string is not in a standard unambiguous format
Traceback:1. as.Date("05-1993-10")2. as.Date.character("05-1993-10")3. charToDate(x)4. stop("character string is not in a standard unambiguous format")Con la tecnología de
La buena noticia es que puedes cambiar el formato explícitamente con el argumento format y adaptarlo.
Este tutorial es un buen punto de partida para quienes quieren aprender varias funciones de utilidad en R. Como buen ejercicio, te recomendamos profundizar en expresiones regulares: se usan en multitud de aplicaciones y son una herramienta potentísima para limpiar o preprocesar texto.
Déjanos cualquier duda sobre el tutorial en los comentarios.
Explore las expresiones regulares en R, por qué son importantes, las herramientas y funciones para trabajar con ellas, patrones regex comunes y cómo utilizarlos.
Un tutorial sobre bucles en R que examina las construcciones disponibles en R para realizar bucles. Descubra alternativas utilizando la función de vectorización de R.
Descubre cómo acceder a los datos de tu marco de datos con el subconjunto. Aprende a hacer subconjuntos utilizando paréntesis o la función subconjunto() de R.
En este tutorial vas a aprender varias funciones y utilidades sencillas y muy usadas en el lenguaje de programación R. Primero, veremos algunas funciones matemáticas. Después, exploraremos funciones relacionadas con las estructuras de datos de R, como la manipulación de listas anidadas, expresiones regulares, y el trabajo con horas y fechas.
Funciones matemáticas
Veamos las siguientes celdas de código que usan varias funciones matemáticas.
Primero defines dos vectores,
xyy, que incluyen valores positivos y negativos.Tomemos estos dos vectores
xyypara:¿Qué tal si descompones la línea anterior en partes pequeñas y miras de cerca cada función?
abs()toma el valor positivo o absoluto de los elementos de los vectoresxyy.Por ejemplo, al aplicar
abs()axyy, obtienes todos los valores positivos, como se muestra abajo.round(). Su cometido es redondear la entrada. Acepta un argumento adicional para indicar a cuántos decimales quieres redondear. Por defecto,round()redondea a cero decimales.Por ejemplo, tras aplicar
round()a los vectoresxyy, la salida sería la siguiente:sum()calcula la suma de los elementos de un vector o matriz. Por ejemplo, si pasas un vector fila como argumento, devolverá un escalar con la suma de todos sus elementos.En este caso, se pasan los vectores
xyyasum(). R calcula la suma de sus elementos y devuelve un escalar.mean()(media) calcula la media aritmética: suma un conjunto de valores numéricos y los divide entre el número de términos.En este caso, la entrada de
mean()es un vector fila de longitud dos con los números7y48. Por tanto, la media es la suma de ambos dividida entre el número de elementos, es decir, 2.Ha sido fácil, ¿verdad?
¡Pasemos al siguiente bloque, el más interesante del tutorial!
Funciones para estructuras de datos
Ahora veamos algunas estructuras de datos como listas y vectores. Verás distintas formas de operar con una
list, invertir unalisty cómo convertir una lista en vector y viceversa.La siguiente función es una
list(), o mejor dicho, unalista de listas(lista anidada). Crea una lista de elementos que puede incluir valores lógicos, numéricos y cadenas.En el ejemplo siguiente hay tres listas dentro de una lista:
log,cheint_vec. Cada una tiene un tipo de dato u objeto de R: lógico, numérico y carácter/cadena.loges un valor lógico, TRUE o FALSEches la cadena de caractereshello_datacampint_veces una secuencia de valores numéricos.Como
logychson directos, fijémonos enint_vec.Entendamos la expresión paso a paso.
La función
seqproduce una secuencia de números en orden descendente del 8 al 2.La sintaxis de
seq()es: seq(x1,x2, by = y)Los dos primeros argumentos,
x1yx2, indican a R el rango de la secuencia (inicio y fin). El argumentobyespecifica el incremento o decremento en cada paso.Por ejemplo, la línea de abajo genera una secuencia de 100 a 200 con un paso de 20.
En nuestro ejemplo,
seqdevuelve una secuencia del 8 al 2 (incluidos) con un decremento de 2, lo que da un vector de longitud 4.Ahora, la función
rep.Puede repetir la entrada (normalmente un vector o lista) usando el argumento
times, que recibe un entero e indica cuántas veces repetir la secuencia.repacepta dos argumentos: la entrada y el número de repeticiones.Aplicando
repa nuestro vector de longitud 4, obtenemos una salida de longitud 8.Si quieres repetir cada elemento del vector o lista, en lugar de repetir el vector completo, usa el argumento
eachcomo alternativa atimes.La diferencia entre
timesyeaches el patrón con el que aparece cada elemento.Por último,
sort(). Es una función genérica y autoexplicativa para ordenar estructuras como vectores o listas. No se limita a numéricos: también funciona con lógicos y caracteres. Por defecto, ordena en ascendente.Pasemos la salida de
repasortpara obtener el resultado final.¡Genial! Has desgranado la expresión larga
int_vec, que estaba dentro de la listalist_define, de forma muy sencilla.Ahora, veamos el contenido de
list_defineusandostr(). Esta función muestra la estructura de los objetos de R.Algunas expresiones útiles de R:
issirven para comprobar el tipo de tu estructura de datos; devuelven un lógico y vienen muy bien con condiciones.Mientras que devuelve FALSE si pasas un vector que no es lista, como se ve abajo.
asseguido de.list()y pasa el vector como argumento.unlist. R lo hace aplanando toda la estructura y devolviendo un único vector.Igual que
is.list(), puedes usaris.vector()para saber si el argumento es un vector.Convirtamos la lista grande
list_definea vector. Ojo: un vector solo puede contener un único tipo de dato u objeto de R. Por tanto, los valoreslogicalynumericse convertirán en cadenas.Antes de pasar al siguiente tema, veamos
append()yrev().append()te permite añadir dos o más vectores o listas a un vector o lista existente o nueva.Probemos
append()conlist_define. Verás que ahora la lista tiene 6 elementos en lugar de 3, porque has concatenado la lista consigo misma.list_defineconrev()en R.Expresiones regulares
Mucha gente ve las expresiones regulares como un tema complejo. Sin embargo, son esenciales no solo en R, sino en muchos lenguajes como Python. Muchos lenguajes, incluido R, traen soporte de regex integrado.
Las expresiones regulares tienen infinidad de aplicaciones y son muy útiles para preprocesar texto. Se usan en problemas de PLN (NLP).
También se emplean en motores de búsqueda y editores de texto.
Las expresiones regulares, también llamadas
regex,regexpuoperadores racionales, son una secuencia de caracteres que define un patrón de búsqueda. Estos patrones se usan para encontrar coincidencias, buscar y reemplazar o filtrar cadenas que encajan con el patrón.Empecemos entendiendo
grep()ygrepl().Para simplificar, definamos un vector fila
animals_regexde longitud 5 sobre el que aplicaremos patrones regex.Primero,
grepl(). Esta función devuelve un lógico: TRUE si la cadena casa con el patrón, FALSE en caso contrario.La sintaxis de
grepl()es sencilla: el primer argumento es el patrón a buscar y el segundo es el vector/cadena donde buscar. Puedes ignorar el resto por ahora. grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) Averigüemos qué animales de los cinco anteriores tienen unacusandogrepl().En este caso buscas animales que contengan
c, así que el patrón es simplementec.Como ves, hay
cen cat, cheetah y mice, por eso esas posiciones del vectoranimals_regexdevuelven TRUE, y FALSE en las que no coinciden conc.Busquemos ahora los elementos que empiezan por
cy no solo los que la contienen.Para ello, usa el acento circunflejo
^al inicio del patrón que quieres encontrar.Como solo cat y cheetah empiezan por
c, solo esas posiciones son TRUE.De forma similar a
^, el signo$al final del patrón sirve para hacer coincidir elementos que terminan con dicho patrón. Para encontrar animales que terminan enn, usanseguido de$.Nota: Para saber más sobre expresiones regulares, escribe
?regexen una celda de Jupyter y se abrirá la documentación. También puedes consultar esta fuente, que ofrece una herramienta para diseñar y probar patrones sobre tus cadenas.grepl(),grep()devuelve los índices del vector/matriz que coinciden con el patrón, en lugar de lógicos.La sintaxis de
grep()es la misma que la degrepl(): grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE). Tomemos el mismo ejemplo de arriba, pero aplicandogrep().Como era de esperar, devuelve los índices de cat, cheetah y mice, no TRUE/FALSE. ¡Y básicamente eso es todo!
Usemos
whichpara comparargrep()ygrepl().which()devuelve los índices de un objeto lógico en los que hayTRUE.Uniendo piezas: como
grepl()devuelve un objeto lógico, puedes pasarlo awhich(), que transformará la salida a algo equivalente agrep().Al igual que
grepl(),grep()maneja distintos patrones de expresiones regulares.Si aplicas
grep()para encontrar elementos en el vector animals_regex que terminan enn, esperas la salida 4, ya que sololionacaba enn, como se muestra:¡Bien hecho!
Has aprendido lo básico de regex: cómo filtrar elementos de un vector que casan con un patrón. Pero R no se limita a buscar patrones. Tiene varias funciones útiles, entre ellas
sub().La función
sub(), en lugar de filtrar, reemplaza las coincidencias por otras cadenas. ¡Veámosla!sub()recibe principalmente tres argumentos:La sintaxis es: sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE). Usemos de nuevo el ejemplo de arriba para entender cómo funciona.
Como ves,
catpasa a seraat,cheetahse convierte enaheetahymiceenmiae. En esas posiciones el patrón ha coincidido.Ten en cuenta que
sub()solo busca la primera coincidencia en cada cadena: si hay dosc, solo la primera se reemplaza pora; la segunda queda igual.Si quieres reemplazar todas las coincidencias, usa
gsub()(fuera del alcance de este tutorial).Antes de pasar al siguiente tema, probemos una expresión más.
Ahora usaremos el operador
|(o) para intentar casar cualquiera de los patrones definidos y, si coinciden, reemplazarlos por-. Recuerda: congsub()se reemplaza cada coincidencia del patrón.¡Pasemos al último tema de hoy: tiempo y fechas!
Tiempo y fechas
La información de fecha y hora puede ser muy útil en muchos casos. Por ejemplo, si trabajas en Visión por Computador y quieres calcular los FPS (frames por segundo) a los que corre tu algoritmo, puedes usar el objeto de tiempo para medir la velocidad de proceso. Para series temporales y análisis de estacionalidad, R despliega todo su potencial.
Para empezar, imprimamos la fecha de hoy en R con
Sys.Date(). Sys hace referencia al sistema, es decir, devuelve la fecha del sistema.Fácil, ¿verdad?
Las fechas y horas en R pertenecen al objeto
Date, es decir, el tipo de dato esDate. Puedes verificarlo con la funciónclassque viste en el tutorial Data Types in R.Similar a la fecha, tienes
time()del sistema conSys.time(), que devuelve hora y fecha actuales.Crear objetos Date
Ya sabes obtener la fecha y hora actuales. Veamos cómo crear fechas de otros días pasando una simple cadena como argumento.
Para crear un objeto fecha para el 10 de mayo de 1993, usa:
Un punto importante: la función
as.Dateen R espera por defecto el formatoYYYY-MM-DD. Si intercambias año, mes o día, obtendrás un error. ¡Probemos!La buena noticia es que puedes cambiar el formato explícitamente con el argumento
formaty adaptarlo.as.Date()acepta distintos formatos de entrada, pero al final convierte a formato ISO. Puedes comprobarlo imprimiendodate_may.Aritmética con fechas
¿No sería genial poder hacer operaciones como suma y resta con objetos Date en R?
Sumemos 1 a
date_mayy verás que muestra la fecha del día siguiente.Perfecto: al sumar uno, la fecha pasa del 10 al 11 de mayo de 1993. Del mismo modo, puedes restar.
Imagina que quieres calcular la diferencia entre tu fecha de nacimiento y la de tu hermana/o mayor.
Conclusión
Enhorabuena por completar el tutorial.
Este tutorial es un buen punto de partida para quienes quieren aprender varias funciones de utilidad en R. Como buen ejercicio, te recomendamos profundizar en expresiones regulares: se usan en multitud de aplicaciones y son una herramienta potentísima para limpiar o preprocesar texto.
Déjanos cualquier duda sobre el tutorial en los comentarios.
Si quieres seguir aprendiendo R, haz el curso Intermediate R de DataCamp y echa un vistazo a nuestro tutorial Using Functions in R.