Reemplazar caracteres específicos dentro de cadenas


262

Me gustaría eliminar caracteres específicos de cadenas dentro de un vector, similar a la función Buscar y reemplazar en Excel.

Aquí están los datos con los que empiezo:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Empiezo con solo la primera columna; Quiero producir la segunda columna quitando los e's:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Respuestas:


399

Con una expresión regular y la función gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Lo que gsubhace aquí es reemplazar cada aparición de "e"con una cadena vacía "".


Ver ?regexpo gsubpara más ayuda.


15
fixed = TRUEHaría esto más rápido.
Rich Scriven

44
@RichScriven ¿podría explicar brevemente por qué?
Glase

66
fixed=TRUEevita que R use expresiones regulares, lo que permite una coincidencia de patrones más flexible pero toma tiempo para calcular. Si todo lo que se necesita es eliminar una sola cadena constante "e", no son necesarias.
mm689

Tendría sub("e", "", group)el mismo resultado?
Matheus Santana

simplemente reemplazaría el primero eque encuentre en cada elemento
sindri_baldur

47

Las expresiones regulares son tus amigos:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Ahora use gsub()con el patrón de reemplazo más simple posible: cadena vacía:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
También ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
Bueno, podría reírme de que "los que no entienden las funciones básicas están condenados a reemplazarlas". Exactamente, ¿qué gana stringr aquí, además de aumentar el número de guiones bajos en su archivo fuente?
Dirk Eddelbuettel

8
" stringr es un conjunto de envoltorios simples que hacen que las funciones de cadena de R sean más consistentes, simples y fáciles de usar " del autor del paquete. Entonces, si lo que dice es cierto (muchos guiones bajos para ajustar las funciones base ...) no hay ninguna razón para que este paquete exista (descargo de responsabilidad: principalmente uso las funciones de expresiones regulares base pero sé que pueden ser difíciles para los nuevos usuarios ... )
dickoa

17
@dickoa: se str_replaceajusta sub, por lo que solo reemplazará la primera aparición del patrón. Tendrías que usarlo str_replace_allsi quisieras el mismo comportamiento que gsub.
Joshua Ulrich

24

Resumiendo 2 formas de reemplazar cadenas:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) uso gsub

group$group.no.e <- gsub("e", "", group$group)

2) Usa el stringrpaquete

group$group.no.e <- str_replace_all(group$group, "e", "")

Ambos producirán el resultado deseado:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
En ese momento, tenía que leer toda la página, incluidos los comentarios, para conocer la sintaxis de stringr, mi método preferido, ya que se discutió principalmente en los comentarios. Esta solución presenta rápidamente ambas opciones, por eso la ofrecí. Mi esperanza era ayudar a otros usuarios a filtrar, como tenía que hacer cuando era nuevo en R. Luché con gsub antes de encontrar stringr porque no se mencionó en una respuesta muy votada. Una vez más, el objetivo no es recopilar votos a favor, sino tratar de ayudar a los nuevos usuarios de R.
Megatron

Si encuentra información en otras respuestas / comentarios que le resulta útil y desea convertir en una respuesta, al menos podría proporcionar alguna atribución para mostrar de dónde obtuvo la información / hacer la respuesta un Comminuty Wiki en lugar de simplemente hacerlo como tu propio.
David Arenburg el

Gracias, lo tendré en cuenta para la próxima vez. Nunca antes había hecho un wiki comunitario, así que no sabía que era una opción.
Megatron

1
La opción 2 funciona muy bien cuando se aplica a una columna de datos en un marco de datos, sin especificar todos los valores en la columna. Obviamente, la opción 1 es una repetición, pero la opción 2 funciona muy bien y merece un voto positivo por la funcionalidad agregada.
Phil_T

6

No necesita crear un marco de datos a partir del vector de cadenas, si desea reemplazar algunos caracteres en él. Las expresiones regulares son una buena opción, ya que @Andrie y @Dirk Eddelbuettel ya lo han mencionado.

Preste atención, si desea reemplazar caracteres especiales, como puntos, debe emplear una sintaxis de expresión regular completa, como se muestra en el siguiente ejemplo:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

esto producirá

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Puedes escapar de ellos, pero también debes escapar del personaje de escape porque está entre comillas:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Usa el paquete stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.