Wie entferne ich alle Leerzeichen aus einer Zeichenfolge?

151

So " xx yy 11 22 33 "wird es werden "xxyy112233". Wie kann ich das erreichen?

Waanders
quelle

Antworten:

258

Im Allgemeinen möchten wir eine Lösung, die vektorisiert ist. Hier ist ein besseres Testbeispiel:

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

Der Basis-R-Ansatz: gsub

gsubErsetzt alle Instanzen einer Zeichenfolge ( fixed = TRUE) oder eines regulären Ausdrucks ( fixed = FALSEStandardeinstellung) durch eine andere Zeichenfolge. Verwenden Sie zum Entfernen aller Leerzeichen:

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

Wie DWin feststellte, ist dies in diesem Fall fixed = TRUEnicht erforderlich, bietet jedoch eine etwas bessere Leistung, da das Abgleichen einer festen Zeichenfolge schneller ist als das Abgleichen eines regulären Ausdrucks.

Wenn Sie alle Arten von Leerzeichen entfernen möchten, verwenden Sie:

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:]"ist eine R-spezifische Gruppe mit regulären Ausdrücken, die allen Leerzeichen entspricht. \sist ein sprachunabhängiger regulärer Ausdruck, der dasselbe tut.


Der stringrAnsatz: str_replace_allundstr_trim

stringrbietet besser lesbare Wrapper für die Basis-R-Funktionen (obwohl ab Dezember 2014 in der Entwicklungsversion ein Zweig aufgebaut ist, der auf dem stringiunten genannten basiert). Die Entsprechungen der obigen Befehle unter Verwendung von [ str_replace_all][3]sind:

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

stringrhat auch eine str_trimFunktion, die nur führende und nachfolgende Leerzeichen entfernt.

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      

Der stringiAnsatz: stri_replace_all_charclassundstri_trim

stringibasiert auf der plattformunabhängigen ICU-Bibliothek und verfügt über umfangreiche Funktionen zur Manipulation von Zeichenfolgen. Die Äquivalente der oben genannten sind:

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

Hier "\\p{WHITE_SPACE}"ist eine alternative Syntax für den Satz von Unicode - Codepunkten betrachtet Leerzeichen zu sein, entspricht "[[:space:]]", "\\s"und space(). Für komplexere Ersetzungen regulärer Ausdrücke gibt es auch stri_replace_all_regex.

stringihat auch Trimmfunktionen .

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
quelle
2
@ Aniko. Gibt es einen Grund, warum Sie fixed = TRUE verwendet haben?
IRTFM
2
@DWin Angeblich ist es schneller, wenn R weiß, dass es nicht das Zeug mit regulären Ausdrücken aufrufen muss. In diesem Fall macht es keinen wirklichen Unterschied, ich habe nur die Angewohnheit, dies zu tun.
Aniko
Gibt es einen Unterschied zwischen "[[:space:]]"und "\\s"?
Sacha Epskamp
5
Wenn Sie auf flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters nachsehen oder einfach? regex eingeben , sehen Sie, dass [: space:] für "Leerzeichen: Registerkarte, Zeilenumbruch" verwendet wird , vertikale Lasche, Formularvorschub, Wagenrücklauf und Leerzeichen. " Das ist viel mehr als nur Platz
Sir Ksilem
1
@ Aniko Hoffe es macht dir nichts aus über die große Bearbeitung. Da diese Frage sehr beliebt ist, schien die Antwort gründlicher zu sein.
Richie Cotton
18

Ich habe gerade etwas über das "stringr" -Paket gelernt, um Leerzeichen am Anfang und Ende eines Strings mit str_trim (, side = "both") zu entfernen, aber es hat auch eine Ersetzungsfunktion, so dass:

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

[1] "xxyy112233"
JollyRoger
quelle
3
Das stringr-Paket funktioniert nicht bei jeder Codierung. Das Stringi-Paket ist eine bessere Lösung. Weitere Informationen finden Sie unter github.com/Rexamine/stringi
bartektartanus
8

Bitte beachten Sie, dass die oben beschriebenen Lösungen nur Leerzeichen entfernen. Wenn Sie auch Tabulatoren oder neue Zeilen entfernen möchten, verwenden Sie diese stri_replace_all_charclassaus dem stringiPaket.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
Bartektartanus
quelle
4
stringiPaket ist jetzt auf CRAN, viel Spaß! :)
Bartektartanus
1
Dieser Befehl oben ist falsch. Der richtige Weg ist stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini
5
Nachdem stringiich es nun einige Monate lang verwendet habe und gesehen / gelernt habe, wie leistungsfähig und effizient es ist, ist es zu meinem bevorzugten Paket für String-Operationen geworden. Ihr habt einen tollen Job gemacht.
Rich Scriven
7

Verwenden Sie [[:blank:]]diese Option, um alle Arten von horizontalen Leerzeichen abzugleichen.

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

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
quelle
4

Die Funktion str_squish()aus dem Paket stringrvon tidyverse macht die Magie!

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
quelle
4
Bitte nicht mit Code verlinken. Fügen Sie es in den Text Ihrer Antwort ein und erklären Sie es hier, um Ihrer Antwort einen längeren Wert zu verleihen.
R Balasubramanian
Vielen Dank an @RBalasubramanian, dass Sie mich an diese Richtlinie erinnert haben. Ich werde es in Zukunft verfolgen.
Damianooldoni
Ich sehe nicht, wie dies die Frage beantwortet. str_squishentfernt nicht alle Leerzeichen. Es werden nur mehrere Leerzeichen für ein Leerzeichen abgeschnitten und ersetzt.
Brennnessel
0

Auf diese Weise können Sie alle Leerzeichen aus allen Zeichenvariablen in Ihrem Datenrahmen entfernen. Wenn Sie nur einige der Variablen auswählen möchten, verwenden Sie mutateoder 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
quelle
-1

In der stringr-Bibliothek können Sie Folgendes versuchen:

  1. Entfernen Sie aufeinanderfolgende Füllrohlinge
  2. Füllrohling entfernen

    Bibliothek (stringr)

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