Crear cadenas en R
Una cadena en R es texto entre comillas. Las comillas dobles y simples funcionan igual y significan exactamente lo mismo; la convención son las dobles, cambiando a simples cuando el texto contiene una comilla doble:
Los escapes con barra invertida funcionan como en la mayoría de lenguajes: \" para una comilla literal, \n para un salto de línea, \t para un tabulador, \\ para la propia barra invertida.
Ahora el error que todo principiante en R comete exactamente una vez: preguntarle a una cadena cuánto mide con length().
nchar() cuenta caracteres - 5. length() cuenta elementos de un vector, y una sola cadena es un vector de un elemento, así que dice 1. En R todo es un vector, incluido el texto, y todas las funciones de esta página trabajan discretamente elemento a elemento sobre vectores de caracteres completos. Eso es una ventaja, en cuanto dejas de sorprenderte.
Unir cadenas: paste() y paste0()
R no tiene + para cadenas. La concatenación es paste(), que une sus argumentos con un espacio por defecto, y paste0(), que une sin nada:
Como paste está vectorizada, pasarle un vector construye muchas cadenas de una vez - así se generan nombres de archivo, etiquetas e identificadores en una línea:
Y el argumento collapse hace lo contrario: funde todo un vector en una única cadena con el separador que elijas:
Recuerda la división: sep controla el pegamento entre argumentos, collapse el pegamento entre elementos de un mismo vector. Puedes usar ambos en la misma llamada.
Formatear con sprintf()
Cuando necesitas números formateados dentro del texto - decimales fijos, anchos rellenados - paste() se queda corta y sprintf() toma el relevo. Usa códigos de formato al estilo de C: %s para cadenas, %d para números enteros, %f para decimales:
%.1f significa "un decimal", %.3f tres, y %05d rellena hasta cinco dígitos con ceros. Un %% duplicado produce un signo de porcentaje literal. sprintf() también está vectorizada, así que puede formatear toda una columna de valores en una llamada - mira entrada y salida para el patrón de informes con sprintf() + cat().
Cambiar mayúsculas y extraer trozos: toupper(), tolower(), substr()
La conversión de mayúsculas y minúsculas es exactamente lo que dice:
tolower() se gana el sueldo normalizando datos desordenados antes de compararlos - "Yes", "YES" y "yes" pasan a ser el mismo valor.
substr(x, start, stop) extrae un trozo por posición de carácter, contando desde 1 (R indexa desde 1 en todas partes):
Ambos extremos son inclusivos: las posiciones de la 1 a la 11 dan "Programming".
Buscar y reemplazar: sub(), gsub() y grepl()
sub() reemplaza la primera aparición de un patrón; gsub() ("global substitute") las reemplaza todas:
Un detalle crítico: el patrón es una expresión regular por defecto, no texto literal. Los caracteres de regex como ., *, ( y ? tienen significados especiales - un . suelto coincide con cualquier carácter. Cuando te refieras al texto literal, pasa fixed = TRUE:
La primera línea da a-b-c; la segunda da -----, porque como regex el . coincidió con todos y cada uno de los caracteres. Hasta que aprendas regex, que fixed = TRUE sea tu opción por defecto y nunca te llevarás un susto.
grepl() no reemplaza - comprueba si cada elemento coincide y devuelve un vector lógico. Eso la convierte en la herramienta estándar para filtrar texto:
El primer resultado marca qué nombres de archivo contienen .csv; el segundo usa ese vector lógico para quedarse solo con las coincidencias.
Dividir y limpiar: strsplit() y trimws()
strsplit() corta una cadena por un separador. Su única rareza: devuelve una lista, porque puede dividir muchas cadenas a la vez. Para una sola cadena, toma el primer elemento con [[1]]:
Y trimws() elimina los espacios en blanco con los que siempre llegan envueltos los datos del mundo real:
Por defecto recorta ambos extremos; which = "left" o "right" recorta solo un lado (los nombres se refieren al inicio y al final de la cadena).
La alternativa stringr
Todo lo anterior es R base - siempre disponible, sin instalar nada. El paquete stringr del tidyverse envuelve las mismas operaciones en un esquema de nombres coherente str_* con la cadena siempre como primer argumento, algo que a mucha gente le resulta más fácil de recordar (mira paquetes para instalarlo):
library(stringr)
str_detect(files, "csv") # like grepl(), data first
str_replace_all(s, "good", "great") # like gsub(), arguments reordered
str_length("hello") # like nchar()
Vale la pena conocer las funciones de cadenas de R base de todos modos - te las encontrarás en cada script, respuesta de Stack Overflow y mensaje de error jamás escrito. Aprende primero los nombres de base; adopta stringr cuando el orden inconsistente de los argumentos empiece a molestarte.
Lo que te llevas
- Las cadenas usan comillas dobles por convención;
nchar()cuenta caracteres,length()cuenta elementos del vector. - Concatena con
paste()/paste0();seppega argumentos,collapsepega un vector en una sola cadena. sprintf()se encarga de la salida formateada:%s,%d,%.2f.sub()reemplaza la primera coincidencia,gsub()todas,grepl()comprueba si hay coincidencia - todas usan regex por defecto, así que pasafixed = TRUEpara texto literal.strsplit()devuelve una lista (toma[[1]]);trimws()limpia la entrada con espacios sobrantes.
Lo siguiente: cómo entra y sale el texto de tus programas - imprimir con print() y cat(), y leer la entrada del usuario.
Preguntas frecuentes
¿Cómo se concatenan cadenas en R?
Con paste() o paste0() - R no tiene + para cadenas. paste("data", "science") da "data science" (separado por un espacio por defecto); paste0("data", "science") une sin nada entre medias. Usa sep = para cambiar el separador y collapse = para fundir todo un vector en una sola cadena.
¿Cómo se obtiene la longitud de una cadena en R?
nchar("hello") devuelve 5, el número de caracteres. length("hello") devuelve 1 - en R, length() cuenta los elementos de un vector, y una sola cadena es un vector de un elemento. Confundir length() con nchar() es el error clásico de quien empieza.
¿Cuál es la diferencia entre sub() y gsub() en R?
Ambas buscan y reemplazan, pero sub() reemplaza solo la primera coincidencia mientras que gsub() ("global sub") reemplaza todas. Las dos tratan el patrón como una expresión regular por defecto - pasa fixed = TRUE para buscar el texto literal.
¿Cómo se divide una cadena en R?
strsplit(x, split) divide según un patrón, pero devuelve una lista (porque puede dividir muchas cadenas a la vez). Para una sola cadena, toma el primer elemento: strsplit("a,b,c", ",")[[1]] da el vector de caracteres "a" "b" "c".