Buscar..


Introducción

sub y gsub se utilizan para editar cadenas utilizando patrones. Consulte Coincidencia y reemplazo de patrones para obtener más información sobre las funciones relacionadas y Expresiones regulares para saber cómo construir un patrón.

Reorganizar cadenas de caracteres utilizando grupos de captura

Si desea cambiar el orden de las cadenas de caracteres, puede usar paréntesis en el pattern para agrupar partes de la cadena. Estos grupos se pueden direccionar en el argumento de replacement usando números consecutivos.

El siguiente ejemplo muestra cómo puede reordenar un vector de nombres de la forma "apellido, nombre" en un vector de la forma "nombre apellido".

library(randomNames) 
set.seed(1)

strings <- randomNames(5)
strings
# [1] "Sigg, Zachary"        "Holt, Jake"           "Ortega, Sandra"       "De La Torre, Nichole"
# [5] "Perkins, Donovon"  

sub("^(.+),\\s(.+)$", "\\2 \\1", strings)
# [1] "Zachary Sigg"        "Jake Holt"           "Sandra Ortega"       "Nichole De La Torre"
# [5] "Donovon Perkins"    

Si solo necesita el apellido, podría abordar los primeros pares de paréntesis.

sub("^(.+),\\s(.+)", "\\1", strings)
# [1] "Sigg"        "Holt"        "Ortega"      "De La Torre" "Perkins"  

Eliminar elementos consecutivos duplicados.

Digamos que queremos eliminar el elemento de subsecuencia duplicado de una cadena (puede ser más de una). Por ejemplo:

2,14,14,14,19

y convertirlo en:

2,14,19

Usando gsub , podemos lograrlo:

gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"

Funciona también para más de una repetición diferente, por ejemplo:

 > gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"

Vamos a explicar la expresión regular:

  1. (\\d+) : Un grupo 1 delimitado por () y encuentra cualquier dígito (al menos uno). Recuerde que necesitamos usar la doble barra diagonal inversa ( \\ ) aquí porque para una variable de carácter una barra diagonal inversa representa un carácter de escape especial para los delimitadores de cadena literal ( \" o \' ). \d\ es equivalente a: [0-9] .
  2. , : Una señal de puntuacion: , (que puede incluir espacios o cualquier otro delimitador)
  3. \\1 : una cadena idéntica al grupo 1, es decir: el número repetido. Si eso no sucede, entonces el patrón no coincide.

Probemos una situación similar: eliminar palabras repetidas consecutivas:

one,two,two,three,four,four,five,six

Luego, simplemente reemplace \d por \w , donde \w coincide con cualquier carácter de palabra, incluyendo: cualquier letra, dígito o guión bajo. Es equivalente a [a-zA-Z0-9_] :

> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
> 

Luego, el patrón anterior incluye como un caso particular, un caso de dígitos duplicados.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow