<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Procesamiento de texto on Bastián Olea</title>
    <link>https://bastianolea.rbind.io/tags/texto/</link>
    <description>Recent content in Procesamiento de texto on Bastián Olea</description>
    <generator>Hugo</generator>
    <language>es-ES</language>
    <lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://bastianolea.rbind.io/tags/texto/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Recodificando variables ordinales cuando vienen sucias y/o desde respuestas abiertas</title>
      <link>https://bastianolea.rbind.io/blog/stringr_limpieza_ordinal/</link>
      <pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/stringr_limpieza_ordinal/</guid>
      <description>&lt;p&gt;Las &lt;strong&gt;variables ordinales&lt;/strong&gt; son aquellas cuyos valores tienen un orden definido, pero la diferencia entre estos valores puede ser variable. Por ejemplo: &lt;em&gt;bajo, medio&lt;/em&gt; y &lt;em&gt;alto.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;En este caso me tocó enfrentarme a una encuesta con una variable ordinal que medía &lt;strong&gt;velocidad de internet&lt;/strong&gt;, que es por naturaleza una variable contínua (números que representan la velocidad), pero que en este caso fue categorizada en intervalos (pasando del valor &lt;code&gt;36&lt;/code&gt; a &amp;ldquo;Entre 20 y 50&amp;rdquo;, por ejemplo) transformándola en una variable ordinal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Limpieza y validación de RUT en R</title>
      <link>https://bastianolea.rbind.io/blog/validacion_rut/</link>
      <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/validacion_rut/</guid>
      <description>&lt;p&gt;En Chile, los &#xA;&lt;a href=&#34;https://es.wikipedia.org/wiki/Rol_%c3%9anico_Nacional&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RUT&lt;/a&gt; son los números de identificación usados para ciudadanos y empresas. Tienen el formato &lt;code&gt;xxxxxxx-y&lt;/code&gt;, donde &lt;code&gt;x&lt;/code&gt; es el número o cuerpo, e &lt;code&gt;y&lt;/code&gt; es el dígito verificador (número entre &lt;code&gt;0&lt;/code&gt; y &lt;code&gt;9&lt;/code&gt; o &lt;code&gt;K&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;En esta publicación entrego algunas funciones para realizar operaciones comunes con los RUT en R, como validarlos, calcular el dígito verificador, y limpiar los RUT, y además entrego estas mismas soluciones en la forma de funciones de &#xA;&lt;a href=&#34;../../../blog/rutera/&#34;&gt;mi paquete &lt;code&gt;{rutera}&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Búsquedas de texto por ranking de relevancia con R usando el algoritmo BM25</title>
      <link>https://bastianolea.rbind.io/blog/buscar_texto/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/buscar_texto/</guid>
      <description>&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            /*background-color: #A985C650;*/&#xA;            background-color: #DEC4F2;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-info-circle&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #9069C0;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%;&#34;&gt;&#xA;    Hice este post porque actualicé el &#xA;&lt;a href=&#34;https://bastianolea.rbind.io/blog/buscador/&#34;&gt;buscador de mi blog&lt;/a&gt; que puedes &#xA;&lt;a href=&#34;https://bastianolea.rbind.io/buscar/&#34;&gt;usar aquí&lt;/a&gt; para que ahora entregue mejores resultados, y lo mejor: ordenados por relevancia. Puedes ver su código &#xA;&lt;a href=&#34;https://github.com/bastianolea/blog_buscador&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;en este repositorio.&lt;/a&gt;&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;p&gt;Cuando tenemos datos que contienen mucho texto, usualmente necesitamos filtrar las observaciones dependiendo de si contienen o no uno o más términos.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Palíndromos de Chile</title>
      <link>https://bastianolea.rbind.io/blog/2026-05-29/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2026-05-29/</guid>
      <description>&lt;p&gt;Un palíndromo es una palabra que se puede leer o escribir al revés y al derecho. Por ejemplo, &amp;ldquo;seres&amp;rdquo; o &amp;ldquo;radar&amp;rdquo; al revés son iguales.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;palíndromos-en-r&#34;&gt;Palíndromos en R&#xA;  &lt;a href=&#34;#pal%c3%adndromos-en-r&#34;&gt;&lt;svg class=&#34;anchor-symbol&#34; aria-hidden=&#34;true&#34; height=&#34;26&#34; width=&#34;26&#34; viewBox=&#34;0 0 22 22&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;      &lt;path d=&#34;M0 0h24v24H0z&#34; fill=&#34;currentColor&#34;&gt;&lt;/path&gt;&#xA;      &lt;path d=&#34;M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76.0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71.0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71.0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76.0 5-2.24 5-5s-2.24-5-5-5z&#34;&gt;&lt;/path&gt;&#xA;    &lt;/svg&gt;&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Hagamos una función en R para poder evaluar si una palabra es palindrómica:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;palindromo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;texto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stringi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;texto_minusc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;tolower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;texto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;texto_limpio&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;chartr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;áéíóú&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;aeiou&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;texto_minusc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;texto_invertido&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;stri_reverse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;texto_limpio&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;texto_limpio&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;texto_invertido&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta función simplemente invierte un texto con &lt;code&gt;stri_reverse()&lt;/code&gt; (cosa que &lt;code&gt;hola&lt;/code&gt; se vuelve &lt;code&gt;aloh&lt;/code&gt;), pero antes transforma la palabra a minúsculas con &lt;code&gt;tolower()&lt;/code&gt;, y le saca los tildes con &lt;code&gt;chartr()&lt;/code&gt;, para obtener la palabra en su versión &lt;em&gt;limpia&lt;/em&gt;. Luego la función compara la palabra invertida con la palabra original, y retorna &lt;code&gt;TRUE&lt;/code&gt; si es palíndromo o &lt;code&gt;FALSE&lt;/code&gt; si no lo es.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Aumenta el conocimiento de inteligencias artificiales creando un sistema de RAG con R</title>
      <link>https://bastianolea.rbind.io/blog/rag_ragnar/</link>
      <pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/rag_ragnar/</guid>
      <description>&lt;p&gt;La &lt;em&gt;generación aumentada por recuperación&lt;/em&gt; o RAG, por sus siglas en inglés (&lt;em&gt;retrieval-augmented generation&lt;/em&gt;) es un proceso por medio del cual puedes &lt;strong&gt;aumentar o complementar el conocimiento de una inteligencia artificial&lt;/strong&gt; para que pueda &lt;strong&gt;responder preguntas basándose en tus propios documentos&lt;/strong&gt; sin necesidad de entrenar un modelo nuevo ni de requerir un modelo de lenguaje gigante y caro.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;&lt;strong&gt;¿Para qué sirve el RAG?&lt;/strong&gt;&lt;/em&gt; Para que cualquier modelo de IA pueda informarse en uno o varios documentos que tú especifiques, y así tenga &lt;strong&gt;conocimiento específico&lt;/strong&gt; de temáticas especializadas. De esta forma, los modelos dejan de depender en los conocimientos de su entrenamiento (que son generales y difusos) y se basan en el conocimiento que tú les proveas para responder.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Extracción de datos estructurados desde texto usando IA</title>
      <link>https://bastianolea.rbind.io/blog/datos_estructurados_llm/</link>
      <pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/datos_estructurados_llm/</guid>
      <description>&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            background-color: #493365;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-triangle-exclamation&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #EAD2FA;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%; color: #EAD2FA;&#34;&gt;&#xA;    Este tutorial lo hice con los aprendizajes que obtuve del excelente &#xA;&lt;a href=&#34;https://thisisnic.github.io/rainbowrworkshop/code.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;workshop &lt;em&gt;LLMs in R for Data Analysis&lt;/em&gt;&lt;/a&gt; impartido por &#xA;&lt;a href=&#34;https://niccrane.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Nic Crane&lt;/a&gt; en la fabulosa &#xA;&lt;a href=&#34;https://conference.rainbowr.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;conferencia de RainbowR 2026&lt;/a&gt;&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;p&gt;Los modelos de lenguaje (LLMs, también llamados coloquialmente &lt;em&gt;inteligencia artificial&lt;/em&gt;) nos pueden ayudar a &lt;strong&gt;transformar textos de cualquier tipo en datos estructurados&lt;/strong&gt;. Esto significa que puedes convertir &lt;strong&gt;entrevistas, reseñas, opiniones, correos, noticias y más&lt;/strong&gt; en &lt;strong&gt;bases de datos&lt;/strong&gt; con la información que necesitas debidamente ordenada en filas y columnas.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Renombrar archivos desde R</title>
      <link>https://bastianolea.rbind.io/blog/2026-02-25/</link>
      <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2026-02-25/</guid>
      <description>&lt;p&gt;Una tarea común en al trabajar con datos (y también en la computación en general) es necesitar renombrar muchos archivos. R puede ayudarnos a realizar este tipo de tareas repetitivas, dado que, además de ser un lenguaje centrado en el análisis de datos, R también puede usarse para cualquier otro propósito!&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;inspeccionar-directorios-y-archivos-con-r&#34;&gt;Inspeccionar directorios y archivos con R&#xA;  &lt;a href=&#34;#inspeccionar-directorios-y-archivos-con-r&#34;&gt;&lt;svg class=&#34;anchor-symbol&#34; aria-hidden=&#34;true&#34; height=&#34;26&#34; width=&#34;26&#34; viewBox=&#34;0 0 22 22&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;      &lt;path d=&#34;M0 0h24v24H0z&#34; fill=&#34;currentColor&#34;&gt;&lt;/path&gt;&#xA;      &lt;path d=&#34;M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76.0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71.0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71.0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76.0 5-2.24 5-5s-2.24-5-5-5z&#34;&gt;&lt;/path&gt;&#xA;    &lt;/svg&gt;&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Hagamos como que tenemos una carpeta llena de archivos (pueden ser imágenes, documentos PDF, u otros documentos), en este caso la carpeta se llama &lt;code&gt;reportes&lt;/code&gt; y dentro tiene 10 documentos PDF.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redactar textos basados en datos usando IA desde R</title>
      <link>https://bastianolea.rbind.io/blog/redactar_texto_llm/</link>
      <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/redactar_texto_llm/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;../../../blog/redactar_texto/&#34;&gt;Como vimos en un post anterior&lt;/a&gt;, podemos usar funcionalidades de R para generar párrafos de texto que se basen en datos, para integrar cifras y otros valores de un &lt;em&gt;dataframe&lt;/em&gt; en un párrafo diseñado para resumir o presentar la información.&lt;/p&gt;&#xA;&lt;p&gt;Si bien esto produce textos de máxima precisión y nos entrega todo el control sobre el texto generado, también existen &lt;strong&gt;herramientas de inteligencia artificial&lt;/strong&gt; que pueden facilitar este trabajo.&lt;/p&gt;&#xA;&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            /*background-color: #A985C650;*/&#xA;            background-color: #DEC4F2;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-info-circle&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #9069C0;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%;&#34;&gt;&#xA;    Al usar IA siempre debemos recordar que obtendremos &lt;strong&gt;resultados probabilísticos&lt;/strong&gt;; es decir que serán resultados que pueden &lt;strong&gt;variar&lt;/strong&gt;, pueden &lt;strong&gt;contener errores&lt;/strong&gt;, y que &lt;strong&gt;no son reproducibles&lt;/strong&gt;.&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;p&gt;Existen paquetes que hacen muy fácil usar IA en R!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redactar textos basados en datos automáticamente con R: describiendo resultados del censo de población</title>
      <link>https://bastianolea.rbind.io/blog/redactar_texto/</link>
      <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/redactar_texto/</guid>
      <description>&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            background-color: #493365;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-triangle-exclamation&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #EAD2FA;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%; color: #EAD2FA;&#34;&gt;&#xA;    También tengo &#xA;&lt;a href=&#34;https://bastianolea.rbind.io/blog/redactar_texto_llm&#34;&gt;una versión alternativa de este tutorial donde usamos IA para generar textos desde R.&lt;/a&gt; Pero ten en consideración que &lt;strong&gt;usar IA y aprender son cosas distintas!&lt;/strong&gt; Recomiendo aprender primero y luego apoyarte en IA.&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;p&gt;Luego de explorar o procesar un conjunto de datos, toca &lt;strong&gt;presentar los resultados&lt;/strong&gt;. Si bien esto nos hace pensar en &#xA;&lt;a href=&#34;../../../tags/visualizaci%c3%b3n-de-datos/&#34;&gt;gráficos&lt;/a&gt;, &#xA;&lt;a href=&#34;../../../tags/tablas/&#34;&gt;tablas&lt;/a&gt; o &#xA;&lt;a href=&#34;../../../tags/quarto/&#34;&gt;reportes&lt;/a&gt;, el &lt;strong&gt;texto&lt;/strong&gt; también es una forma de comunicar resultados que puede ser &lt;strong&gt;optimizada&lt;/strong&gt; mediante la programación.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redactar palabras en plural en R</title>
      <link>https://bastianolea.rbind.io/blog/2025-10-21b/</link>
      <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2025-10-21b/</guid>
      <description>&lt;p&gt;Cuando desarrollamos &#xA;&lt;a href=&#34;../../../tags/quarto/&#34;&gt;reportes&lt;/a&gt;, &#xA;&lt;a href=&#34;../../../tags/gr%c3%a1ficos/&#34;&gt;gráficos&lt;/a&gt; o &#xA;&lt;a href=&#34;../../../tags/shiny/&#34;&gt;aplicaciones&lt;/a&gt; en R, necesitamos hacer que nuestros &#xA;&lt;a href=&#34;../../../tags/texto/&#34;&gt;textos&lt;/a&gt; se adapten a los datos que estamos analizando.&lt;/p&gt;&#xA;&lt;p&gt;Si tenemos que poner texto sobre una cantidad de elementos, tenemos que escribir en singular o plural dependiendo de la cantidad (&lt;em&gt;1 gato, 2 gatos&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Por ejemplo, si tenemos un objeto &lt;code&gt;cantidad&lt;/code&gt; que contiene el número de gatos, y queremos escribir un texto que diga &amp;ldquo;gato&amp;rdquo; o &amp;ldquo;gatos&amp;rdquo; dependiendo de la cantidad, podemos usar la función &lt;code&gt;ifelse()&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Etiquetas de texto que se repelen entre sí con {ggrepel}</title>
      <link>https://bastianolea.rbind.io/blog/ggrepel/</link>
      <pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/ggrepel/</guid>
      <description>&lt;link href=&#34;index_files/libs/htmltools-fill-0.5.8.1/fill.css&#34; rel=&#34;stylesheet&#34; /&gt;&#xA;&lt;script src=&#34;index_files/libs/htmlwidgets-1.6.4/htmlwidgets.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;index_files/libs/d3-bundle-5.16.0/d3-bundle.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;index_files/libs/d3-lasso-0.0.5/d3-lasso.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;index_files/libs/save-svg-as-png-1.4.17/save-svg-as-png.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;index_files/libs/flatbush-4.4.0/flatbush.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;link href=&#34;index_files/libs/ggiraphjs-0.8.10/ggiraphjs.min.css&#34; rel=&#34;stylesheet&#34; /&gt;&#xA;&lt;script src=&#34;index_files/libs/ggiraphjs-0.8.10/ggiraphjs.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;index_files/libs/girafe-binding-0.8.10/girafe.js&#34;&gt;&lt;/script&gt;&#xA;&lt;p&gt;En este post veremos a agregar &lt;strong&gt;textos que se distancian entre sí automáticamente&lt;/strong&gt; a tus gráficos. Esto sirve, por ejemplo, para mejorar visualizaciones de datos a las que queremos agregarle texto que identifique las observaciones, aún cuando las observaciones son demasiadas como para etiquetarlas a todas.&lt;/p&gt;&#xA;&lt;p&gt;Usaremos el &#xA;&lt;a href=&#34;https://ggrepel.slowkow.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;paquete de R &lt;code&gt;{ggrepel}&lt;/code&gt;&lt;/a&gt; para etiquetar puntos en un gráfico con textos que se repelen entre sí de forma automática.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            background-color: #493365;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-triangle-exclamation&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #EAD2FA;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%; color: #EAD2FA;&#34;&gt;&#xA;    Este post requiere conocimientos de &lt;code&gt;{ggplot2}&lt;/code&gt;. Si quieres aprender a hacer gráficos en R, revisa &#xA;&lt;a href=&#34;https://bastianolea.rbind.io/blog/r_introduccion/tutorial_visualizacion_ggplot/&#34;&gt;este tutorial sobre visualización de datos&lt;/a&gt; primero.&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;datos&#34;&gt;Datos&#xA;  &lt;a href=&#34;#datos&#34;&gt;&lt;svg class=&#34;anchor-symbol&#34; aria-hidden=&#34;true&#34; height=&#34;26&#34; width=&#34;26&#34; viewBox=&#34;0 0 22 22&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;      &lt;path d=&#34;M0 0h24v24H0z&#34; fill=&#34;currentColor&#34;&gt;&lt;/path&gt;&#xA;      &lt;path d=&#34;M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76.0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71.0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71.0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76.0 5-2.24 5-5s-2.24-5-5-5z&#34;&gt;&lt;/path&gt;&#xA;    &lt;/svg&gt;&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A modo de ejemplo, usaremos datos del &#xA;&lt;a href=&#34;https://www.bcn.cl/procesoconstituyente/plebiscito2020&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;plebiscito de entrada de 2020 en Chile&lt;/a&gt;, obtenidos desde el &#xA;&lt;a href=&#34;https://github.com/bastianolea/plebiscitos_chile&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;repositorio de datos sobre los plebiscitos constitucionales&lt;/a&gt;. Éste repositorio, parte de mi &#xA;&lt;a href=&#34;https://bastianolea.github.io/datos_sociales/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mini sitio de datos sociales chilenos&lt;/a&gt;, ofrece versiones limpias y listas para usar de los resultados electorales de estos procesos.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Limpieza y recodificación de datos de texto en R con {stringr}</title>
      <link>https://bastianolea.rbind.io/blog/stringr_texto/</link>
      <pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/stringr_texto/</guid>
      <description>&lt;div style = &#34;margin-left: -16px;&#34;&gt;&#xA;  &#xA;  &lt;details closed id=&#34;PageTableOfContents&#34;&gt;&#xA;    &lt;summary&gt;&#xA;      &lt;h2 class=&#34;mv0 f5 fw7 ttu tracked dib&#34; style = &#34;margin-left: 6px; font-size: 120%;&#34;&gt;Índice&lt;/h2&gt;&#xA;      &lt;/summary&gt;&#xA;    &lt;div class=&#34;pl2 pr0 mh0&#34; style = &#34;font-size: 90%; margin-top: -8px; margin-left: 16px; margin-bottom: 32px;&#34;&gt;&#xA;    &lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ul&gt;&#xA;    &lt;li&gt;&#xA;      &lt;ul&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#crear-variable-a-partir-de-la-detección-de-texto&#34;&gt;Crear variable a partir de la detección de texto&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ul&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#cambiar-la-capitalización-de-un-texto&#34;&gt;Cambiar la capitalización de un texto&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#expresiones-regulares&#34;&gt;Expresiones regulares&lt;/a&gt;&#xA;      &lt;ul&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#extraer-caracteres-desde-un-texto&#34;&gt;Extraer caracteres desde un texto&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ul&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ul&gt;&#xA;&lt;/nav&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/details&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://stringr.tidyverse.org/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;El paquete &lt;code&gt;{stringr}&lt;/code&gt;&lt;/a&gt; facilita todo tipo de trabajo que implique texto en R.&lt;/p&gt;&#xA;&lt;p&gt;En general, los datos que vienen como texto suelen necesitar una limpieza previa, y adicionalmente un procesamiento para poder aprovecharlos mejor.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Limpiar textos con símbolos, tildes o eñes en R</title>
      <link>https://bastianolea.rbind.io/blog/limpiar_texto_simbolos/</link>
      <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/limpiar_texto_simbolos/</guid>
      <description>&lt;p&gt;Amamos el castellano, con sus tildes y eñes, y nos encanta que R no tenga problemas para usar estos símbolos en cualquier parte del lenguaje. Pero hay veces en las que necesitamos deshacernos de estos símbolos especiales, como tildes, eñes, e incluso mayúsculas.&lt;/p&gt;&#xA;&lt;p&gt;Por ejemplo:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Si queremos dar nombres a carpetas (porque puede dar conflictos con otros sistemas operativos o para subir archivos a internet),&lt;/li&gt;&#xA;&lt;li&gt;Si queremos buscar coincidencias de texto con &lt;code&gt;stringr::str_detect()&lt;/code&gt; y queremos aumentar probabilidades de coincidir al omitir variaciones de los caracteres,&lt;/li&gt;&#xA;&lt;li&gt;Si queremos hacer un &lt;code&gt;left_join()&lt;/code&gt; entre dos bases de datos con formas distintas de guardar los datos (todos en mayúscula, todos sin tilde pero con eñes, etc.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Hay muchas formas distintas de hacerlo, dependiendo de lo que necesitemos. El paquete &lt;code&gt;{stringr}&lt;/code&gt; se enfoca en el procesamiento de texto y tiene varias funciones que nos pueden ayudar.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redactar una lista de palabras separadas por comas en R</title>
      <link>https://bastianolea.rbind.io/blog/2025-03-30/</link>
      <pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2025-03-30/</guid>
      <description>&lt;p&gt;Cuando obtenemos una lista de palabras que obtuvimos desde nuestros datos, y&#xA;queremos incluirlas en algún reporte &amp;mdash;ya sea como el título de un gráfico, el&#xA;subtítulo de un capítulo, o un texto dinámico basado en los datos&amp;mdash; vamos a&#xA;querer que estén redactadas correctamente: separadas por comas. La función&#xA;&lt;code&gt;paste()&lt;/code&gt; sirve para unir distintos objetos de tipo texto.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;paste&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;primera&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;segunda&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;[1] &amp;quot;primera segunda&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Si queremos unir las dos palabras, podemos especificar un separador:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips para limpieza de datos en R</title>
      <link>https://bastianolea.rbind.io/blog/limpieza_tips/</link>
      <pubDate>Wed, 13 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/limpieza_tips/</guid>
      <description>&lt;p&gt;En este post dejo algunos de los paquetes y funciones que uso frecuentemente al momento de limpiar datos en R. Voy a ir actualizando este post por si se me van ocurriendo más.&lt;/p&gt;&#xA;&lt;div style = &#34;max-width: 220px&#34;&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;janitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stringr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dplyr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;library&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lubridate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;limpiar-nombres-de-columnas&#34;&gt;Limpiar nombres de columnas&#xA;  &lt;a href=&#34;#limpiar-nombres-de-columnas&#34;&gt;&lt;svg class=&#34;anchor-symbol&#34; aria-hidden=&#34;true&#34; height=&#34;26&#34; width=&#34;26&#34; viewBox=&#34;0 0 22 22&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;      &lt;path d=&#34;M0 0h24v24H0z&#34; fill=&#34;currentColor&#34;&gt;&lt;/path&gt;&#xA;      &lt;path d=&#34;M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76.0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71.0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71.0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76.0 5-2.24 5-5s-2.24-5-5-5z&#34;&gt;&lt;/path&gt;&#xA;    &lt;/svg&gt;&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;janitor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;clean_names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como su nombre lo indica, esta función cambia los nombres de las variables o columnas para estandarizar la forma en que están escritas: todo en minúsculas, sin espacios, sin símbolos, y las palabras separadas con guión bajo. Esto facilita mucho el trabajo con datos, ya que minimiza las probabilidades de qué te equivoques al escribir el nombre de una columna. Personalmente siempre ocupo esta función al momento de cargar datos, sobre todo si estos datos vienen desde Excel. Lo único malo de &lt;code&gt;clean_names()&lt;/code&gt; es que esta función también cambia las eñes por enes.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
