¿Cómo eliminar todos los espacios en blanco de una cadena?

Respuestas:

258

En general, queremos una solución vectorizada, así que aquí hay un mejor ejemplo de prueba:

whitespace <- " \t\n\r\v\f" # space, tab, newline, 
                            # carriage return, vertical tab, form feed
x <- c(
  " x y ",           # spaces before, after and in between
  " \u2190 \u2192 ", # contains unicode chars
  paste0(            # varied whitespace     
    whitespace, 
    "x", 
    whitespace, 
    "y", 
    whitespace, 
    collapse = ""
  ),   
  NA                 # missing
)
## [1] " x y "                           
## [2] " ← → "                           
## [3] " \t\n\r\v\fx \t\n\r\v\fy \t\n\r\v\f"
## [4] NA

El enfoque base R: gsub

gsubreemplaza todas las instancias de una cadena ( fixed = TRUE) o expresión regular ( fixed = FALSEel valor predeterminado) con otra cadena. Para eliminar todos los espacios, use:

gsub(" ", "", x, fixed = TRUE)
## [1] "xy"                            "←→"             
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA 

Como DWin señaló, en este caso fixed = TRUEno es necesario, pero proporciona un rendimiento ligeramente mejor ya que hacer coincidir una cadena fija es más rápido que hacer coincidir una expresión regular.

Si desea eliminar todos los tipos de espacios en blanco, use:

gsub("[[:space:]]", "", x) # note the double square brackets
## [1] "xy" "←→" "xy" NA 

gsub("\\s", "", x)         # same; note the double backslash

library(regex)
gsub(space(), "", x)       # same

"[:space:]"es un grupo de expresión regular específico de R que coincide con todos los caracteres de espacio. \ses una expresión regular independiente del lenguaje que hace lo mismo.


El stringrenfoque: str_replace_allystr_trim

stringrproporciona más envoltorios legibles para los humanos alrededor de las funciones básicas de R (aunque a partir de diciembre de 2014, la versión de desarrollo tiene una rama incorporada stringi, mencionada a continuación). Los equivalentes de los comandos anteriores, usando [ str_replace_all][3], son:

library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")

stringrtambién tiene una str_trimfunción que elimina solo los espacios en blanco iniciales y finales.

str_trim(x) 
## [1] "x y"          "← →"          "x \t\n\r\v\fy" NA    
str_trim(x, "left")    
## [1] "x y "                   "← → "    
## [3] "x \t\n\r\v\fy \t\n\r\v\f" NA     
str_trim(x, "right")    
## [1] " x y"                   " ← →"    
## [3] " \t\n\r\v\fx \t\n\r\v\fy" NA      

El stringienfoque: stri_replace_all_charclassystri_trim

stringiestá construido sobre la biblioteca de la UCI independiente de la plataforma y tiene un amplio conjunto de funciones de manipulación de cadenas. Los equivalentes de lo anterior son:

library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")

Aquí "\\p{WHITE_SPACE}"hay una sintaxis alternativa para el conjunto de puntos de código Unicode considerados espacios en blanco, equivalentes a "[[:space:]]", "\\s"y space(). Para reemplazos de expresiones regulares más complejas, también existe stri_replace_all_regex.

stringiTambién tiene funciones de recorte .

stri_trim(x)
stri_trim_both(x)    # same
stri_trim(x, "left")
stri_trim_left(x)    # same
stri_trim(x, "right")  
stri_trim_right(x)   # same
Aniko
fuente
2
@Aniko. ¿Hay alguna razón por la que usaste fixed = TRUE?
IRTFM
2
@DWin Supuestamente es más rápido si R sabe que no tiene que invocar el material de expresión regular. En este caso, realmente no hace ninguna diferencia, solo tengo la costumbre de hacerlo.
Aniko
¿Hay alguna diferencia entre "[[:space:]]"y "\\s"?
Sacha Epskamp
55
si verifica flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters o simplemente escribe? regex, verá que [: space:] se usa para "Space space: tab, newline , pestaña vertical, avance de formulario, retorno de carro y espacio ". Eso es mucho más que solo espacio
Sir Ksilem
1
@ Aniko Espero que no te importe la gran edición. Como esta pregunta es muy popular, parecía que la respuesta debía ser más exhaustiva.
Richie Cotton
18

Acabo de enterarme del paquete "stringr" para eliminar el espacio en blanco desde el principio y el final de una cadena con str_trim (, side = "both") pero también tiene una función de reemplazo para que:

a <- " xx yy 11 22 33 " 
str_replace_all(string=a, pattern=" ", repl="")

[1] "xxyy112233"
Bandera pirata
fuente
3
El paquete stringr no funciona bien con todas las codificaciones. el paquete stringi es la mejor solución, para obtener más información, consulte github.com/Rexamine/stringi
bartektartanus
8

Tenga en cuenta que las almas escritas anteriormente eliminan solo el espacio. Si también desea eliminar la pestaña o el uso stri_replace_all_charclassde una nueva línea del stringipaquete.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
bartektartanus
fuente
44
stringipaquete está en CRAN ahora, ¡disfrútalo! :)
bartektartanus
1
Este comando anterior es incorrecto. La forma correcta es stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini
55
Después de usarlo stringidurante unos meses y haber visto / aprendido lo poderoso y eficiente que es, se ha convertido en mi paquete de referencia para operaciones con cadenas. Ustedes hicieron un trabajo increíble con eso.
Rich Scriven
7

Se usa [[:blank:]]para unir cualquier tipo de caracteres de espacio en blanco horizontal.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"
Avinash Raj
fuente
6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
fuente
4

¡La función str_squish()del paquete stringrde tidyverse hace la magia!

library(dplyr)
library(stringr)

df <- data.frame(a = c("  aZe  aze s", "wxc  s     aze   "), 
                 b = c("  12    12 ", "34e e4  "), 
                 stringsAsFactors = FALSE)
df <- df %>%
  rowwise() %>%
  mutate_all(funs(str_squish(.))) %>%
  ungroup()
df

# A tibble: 2 x 2
  a         b     
  <chr>     <chr> 
1 aZe aze s 12 12 
2 wxc s aze 34e e4
damianooldoni
fuente
44
Por favor no enlace al código. Agréguelo en el cuerpo del texto de su respuesta y explíquelo aquí, para darle a su respuesta un valor más a largo plazo.
R Balasubramanian
Gracias @RBalasubramanian por recordarme esta guía. Lo seguiré en el futuro.
damianooldoni
No veo cómo esto responde la pregunta. str_squishNo elimina todos los espacios. Simplemente recorta y sustituye múltiples espacios por uno.
Ortiga
0

De esta manera, puede eliminar todos los espacios de todas las variables de caracteres en su marco de datos. Si prefiere elegir solo algunas de las variables, use mutateo mutate_at.

library(dplyr)
library(stringr)

remove_all_ws<- function(string){
    return(gsub(" ", "", str_squish(string)))
}

df<-df %>%  mutate_if(is.character, remove_all_ws)
NinaOtopal
fuente
-1

Desde la biblioteca stringr puedes probar esto:

  1. Eliminar espacios de relleno consecutivos
  2. Eliminar relleno en blanco

    biblioteca (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Data Jules
fuente