Antworten:
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
gsubgsubErsetzt 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.
stringrAnsatz: str_replace_allundstr_trimstringrbietet 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
stringiAnsatz: stri_replace_all_charclassundstri_trimstringibasiert 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
"[[:space:]]"und "\\s"?
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"
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"
stringiPaket ist jetzt auf CRAN, viel Spaß! :)
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.
Verwenden Sie [[:blank:]]diese Option, um alle Arten von horizontalen Leerzeichen abzugleichen.
gsub("[[:blank:]]", "", " xx yy 11 22 33 ")
# [1] "xxyy112233"
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
str_squishentfernt nicht alle Leerzeichen. Es werden nur mehrere Leerzeichen für ein Leerzeichen abgeschnitten und ersetzt.
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)
In der stringr-Bibliothek können Sie Folgendes versuchen:
Füllrohling entfernen
Bibliothek (stringr)
2. 1.
| |
V V
str_replace_all(str_trim(" xx yy 11 22 33 "), " ", "")