Extraer y reemplazar subcadenas en R con substring() y substr()

Manipulación de datos con R Manipulación de texto
Las funciones substring() y substr() en R

Las funciones substring y substr de R permiten extraer o reemplazar partes de una cadena de texto. Sin embargo, los nombres de los argumentos difieren y mientras que substr requiere tanto la posición inicial como la final de los elementos a extraer o reemplazar, substring puede tomar sólo la primera posición y opcionalmente la última.

Sintaxis de las funciones substring y substr

Estas funciones pueden extraer o reemplazar subcadenas y tienen una sintaxis similar, ya que ambas toman una cadena o vector de caracteres como entrada (x o text), el primer elemento a extraer o reemplazar (first o start) y el último elemento a extraer o reemplazar (stop o last), pero substring proporciona un valor por defecto para last, por lo que es un argumento opcional.

# Para extraer valores:
substr(x, start, stop)
substring(text, first, last = 1000000L)


# Para reemplazar valores:
substr(x, start, stop) <- value
substring(text, first, last = 1000000L) <- value

La salida de estas funciones también tiene diferencias dependiendo de la longitud del texto de entrada, ya que substr devuelve un vector de caracteres de la longitud de x pero substring puede devolver más elementos dependiendo de la longitud de first y last.

Extraer subcadenas

Considera que tienes una cadena, por ejemplo "String" y quieres obtener los tres primeros caracteres. Para ello puedes utilizar substr o substring especificando las posiciones inicial y final deseadas de la siguiente manera:

# Con substr()
substr("String", start = 1, stop = 3)

# Con substring()
substring("String", first = 1, last = 3)
"Str"
"Str"

Sin embargo, si quieres extraer valores desde cualquier posición hasta el último carácter tendrás que especificar stop con substr pero cuando utilices substring no necesitarás especificar last. Ten en cuenta que puedes utilizar la función nchar() para obtener la longitud de una cadena de texto en R.

# Con substr()
substr("String", start = 4, stop = nchar("String"))

# Con substring() (no es necesario especificar 'last')
substring("String", first = 4)
"ing"
"ing"

Como se ha indicado anteriormente, con substr se requieren tanto start como stop, por lo que se producirá un error si no se especifica stop.

substr("String", start = 4) # Error
Error in substr("String", start = 4) : 
  argument "stop" is missing, with no default

Extraer varias subcadenas a la vez

Otra diferencia entre substr y substring es que substr devuelve un vector de la longitud de x mientras que la salida de substring depende de la longitud de las posiciones especificadas.

# Del primer al segundo elemento y del segundo al cuarto
substr(c("String", "String"), start = c(1, 2), stop = c(2, 4))
"St" "tri"

El siguiente ejemplo devuelve seis elementos con subcadenas con el primer elemento hasta el último, del segundo elemento al último y así sucesivamente.

# Del primero al último, del segundo al último, ..., del sexto al último
substring("String", first = 1:6)
"String" "tring"  "ring"   "ing"    "ng"     "g" 

Reemplazar subcadenas

Las subcadenas también pueden sustituirse por cualquier otra cadena con el mismo número de caracteres de la subcadena original. Para ello, tendrás que almacenar tu cadena en una variable y luego asignar un valor a la subcadena.

El siguinte es un ejemplo utilizando substr:

# String objetivo
string <- "String"

# Reemplazar del primer al segundo elemento con "AB"
substr(string, start = 1, stop = 2) <- "AB"

# Vemos el resultado
string
"ABring"

Lo mismo aplica para la función substring:

# String objetivo
string <- "String"

# Reemplazar del tercer elemento al último con "1234"
substring(string, first = 3) <- "1234"

# Vemos el resultado
string
"St1234"

Ten en cuenta que si el número de caracteres de la sustitución es mayor que el número de caracteres de la subcadena, se ignorarán los caracteres restantes.

Si quieres eliminar una subcadena utilice las funciones gsub() o sub():

# String objetivo
string <- "String"

# Eliminamos "Str" de"String"
gsub("Str", "", string)
"ing"

R version 4.3.2 (2023-10-31 ucrt)