Come rimuovere tutti gli spazi bianchi da una stringa?


152

Così " xx yy 11 22 33 "diventerà "xxyy112233". Come posso raggiungere questo obiettivo?

Risposte:


258

In generale, vogliamo una soluzione vettorializzata, quindi ecco un esempio di test migliore:

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

L'approccio di base R: gsub

gsubsostituisce tutte le istanze di una stringa ( fixed = TRUE) o un'espressione regolare ( fixed = FALSE, l'impostazione predefinita) con un'altra stringa. Per rimuovere tutti gli spazi, utilizzare:

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

Come notato da DWin, in questo caso fixed = TRUEnon è necessario ma offre prestazioni leggermente migliori poiché la corrispondenza di una stringa fissa è più rapida della corrispondenza di un'espressione regolare.

Se vuoi rimuovere tutti i tipi di spazi bianchi, usa:

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:]"è un gruppo di espressioni regolari specifico per R che corrisponde a tutti i caratteri dello spazio. \sè un'espressione regolare indipendente dalla lingua che fa la stessa cosa.


L' stringrapproccio: str_replace_allestr_trim

stringrfornisce più wrapper leggibili dall'uomo intorno alle funzioni R di base (anche se a partire da dicembre 2014, la versione di sviluppo ha un ramo costruito sopra stringi, menzionato di seguito). Gli equivalenti dei comandi precedenti, usando [ str_replace_all][3], sono:

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

stringrha anche una str_trimfunzione che rimuove solo gli spazi bianchi iniziali e finali.

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      

L' stringiapproccio: stri_replace_all_charclassestri_trim

stringiè basato sulla libreria ICU indipendente dalla piattaforma e dispone di un ampio set di funzioni di manipolazione delle stringhe. Gli equivalenti di quanto sopra sono:

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

Qui "\\p{WHITE_SPACE}"è una sintassi alternativa per il set di punti di codice Unicode considerati spazi bianchi, equivalente a "[[:space:]]", "\\s"e space(). Per sostituzioni di espressioni regolari più complesse, esiste anche stri_replace_all_regex.

stringiha anche funzioni di assetto .

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

2
@Aniko. C'è un motivo che hai usato fixed = TRUE?
IRTFM,

2
@DWin Presumibilmente è più veloce se R sa che non deve invocare la roba dell'espressione regolare. In questo caso non fa davvero alcuna differenza, ho solo l'abitudine di farlo.
Aniko,

C'è una differenza tra "[[:space:]]"e "\\s"?
Sacha Epskamp,

5
se controlli su flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters o digiti semplicemente? regex, vedrai che [: space:] è usato per "Space space: tab, newline , scheda verticale, avanzamento modulo, ritorno a capo e spazio. " È molto più del solo spazio
Sir Ksilem,

1
@Aniko Spero non ti dispiaccia la modifica grande. Poiché questa domanda è molto popolare, sembrava che la risposta dovesse essere più approfondita.
Richie Cotton,

18

Ho appena imparato a conoscere il pacchetto "stringr" per rimuovere lo spazio bianco dall'inizio e alla fine di una stringa con str_trim (, side = "both") ma ha anche una funzione di sostituzione in modo che:

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

[1] "xxyy112233"

3
Il pacchetto stringr non funziona bene con ogni codifica. Il pacchetto stringi è la soluzione migliore, per maggiori informazioni controlla github.com/Rexamine/stringi
bartektartanus

8

Nota che le animazioni scritte sopra rimuovono solo lo spazio. Se si desidera rimuovere anche la scheda o la nuova riga, utilizzare stri_replace_all_charclassdal stringipacchetto.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"

4
stringiil pacchetto è ora su CRAN, buon divertimento! :)
bartektartanus

1
Questo comando sopra non è corretto. La strada giusta è stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini,

5
Dopo stringiaverlo usato per alcuni mesi e visto / imparato quanto sia potente ed efficiente, è diventato il mio pacchetto di riferimento per le operazioni sulle stringhe. Ragazzi, avete fatto un ottimo lavoro.
Rich Scriven,

7

Utilizzare [[:blank:]]per abbinare qualsiasi tipo di carattere white_space orizzontale.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"

6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

La funzione str_squish()dal pacchetto stringrdi tidyverse fa 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

4
Si prega di non collegare al codice. Aggiungilo nel corpo del testo della tua risposta e spiegalo qui, per dare alla tua risposta un valore più a lungo termine.
R Balasubramanian,

Grazie @RBalasubramanian per avermi ricordato questa linea guida. Lo seguirò in futuro.
Damianooldoni,

Non vedo come questo risponda alla domanda. str_squishnon rimuove tutti gli spazi. Taglia e sostituisce semplicemente più spazi per uno.
Ortica

0

In questo modo è possibile rimuovere tutti gli spazi da tutte le variabili di carattere nel frame di dati. Se preferisci scegliere solo alcune delle variabili, usa 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)

-1

Dalla libreria stringr potresti provare questo:

  1. Rimuovere gli spazi di riempimento consecutivi
  2. Rimuovi riempimento vuoto

    biblioteca (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.