2012-08-13 102 views
178

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

Éstos son los datos que empezar con:

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

comienzo con sólo la primera columna; Quiero producir la segunda columna mediante la eliminación de los e 's:

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

Respuesta

279

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 gsub hace aquí es reemplazar cada aparición de "e" con una cadena vacía "".


Ver ?regexp o gsub para obtener más ayuda.

+8

'fijado = TRUE' haría esto más rápido. –

+2

@RichScriven ¿podría explicar brevemente por qué? – glaed

+3

'fixed = TRUE' impide que R use expresiones regulares, lo que permite una coincidencia de patrones más flexible, pero lleva tiempo calcular. Si todo lo que se necesita es eliminar una única cadena constante "e", no son necesarios. – mm689

36

Las expresiones regulares son sus 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 usa gsub() con el patrón de sustitución más sencilla 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> 
+2

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

+23

Bueno, podría reírme que "aquellos que no entienden las funciones base están condenados a reemplazarlos". ¿Qué gana el stringr aquí, además de aumentar el número de guiones bajos en su archivo fuente? –

+7

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

15

Resumiendo 2 formas de reemplazar cadenas:

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

1) Use gsub

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

2) utilizar el paquete stringr

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

Tanto producirá la salida de deseo:

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

'gsub()' ya se mencionó en las otras respuestas –

+2

En ese momento, usted tuvo que leer toda la página incluyendo comentarios para aprender la sintaxis de stringr, mi método preferido, ya que fue discutido principalmente en los comentarios. Esta solución presenta rápidamente ambas opciones, y es por eso que lo ofrecí. Mi esperanza era ayudar a otros usuarios a filtrar de la misma forma que cuando era nuevo en R. Tuve problemas con gsub antes de encontrar stringr * porque * no se mencionó en una respuesta muy votada. Nuevamente, el objetivo no es recolectar votos al alza sino tratar de ayudar a los nuevos usuarios de R a salir. – Megatron

+0

Si encuentra información en otras respuestas/comentarios que le parezcan útiles y quiera convertir a una respuesta, al menos podría proporcionar alguna atribución para mostrar de dónde obtuvo la información de/haga que la respuesta sea una Wiki Comminuty en lugar de simplemente hacerlo como tuyo –

2

Uso del stringi paquete:

require(stringi) 

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

Usted no necesita crear el marco de datos del vector de cadenas, si desea reemplazar algunos caracteres en él. Las expresiones regulares son una buena opción, como ya lo mencionaron @Andrie y @Dirk Eddelbuettel.

Tener en cuenta, si desea reemplazar caracteres especiales, como puntos, se debe emplear la sintaxis completa de expresiones regulares, como se muestra en el ejemplo a continuación:

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

esto producirá

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