Donc, " xx yy 11 22 33 "
deviendra "xxyy112233"
. Comment puis-je atteindre cet objectif?
En général, nous voulons une solution vectorisée, voici donc un meilleur exemple de test:
_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
_
gsub
gsub
remplace toutes les occurrences d'une chaîne (_fixed = TRUE
_) ou d'une expression régulière (_fixed = FALSE
_, valeur par défaut) par une autre chaîne. Pour supprimer tous les espaces, utilisez:
_gsub(" ", "", x, fixed = TRUE)
## [1] "xy" "←→"
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA
_
Comme DWin l'a noté, dans ce cas, _fixed = TRUE
_ n'est pas nécessaire, mais offre des performances légèrement meilleures, car la mise en correspondance d'une chaîne fixe est plus rapide que celle d'une expression régulière.
Si vous souhaitez supprimer tous les types d'espaces, utilisez:
_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:]"
est un groupe d'expressions régulières spécifique à R, correspondant à tous les caractères d'espacement. _\s
_ est une expression régulière indépendante du langage qui fait la même chose.
stringr
: _str_replace_all
_ et _str_trim
_stringr
fournit davantage de wrappers lisibles par l'homme autour des fonctions R de base (bien que, à compter de décembre 2014, la version de développement ait une branche construite sur stringi
, mentionnée ci-dessous). Les équivalents des commandes ci-dessus, en utilisant [_str_replace_all][3]
_, sont les suivants:
_library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")
_
stringr
a également une fonction str_trim
qui supprime uniquement les espaces de début et de fin.
_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
_
stringi
: _stri_replace_all_charclass
_ et _stri_trim
_stringi
est construit sur la plate-forme indépendante bibliothèque ICU , et possède un ensemble complet de fonctions de manipulation de chaînes. Les équivalents de ce qui précède sont:
_library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")
_
Ici "\\p{WHITE_SPACE}"
est une syntaxe alternative pour l'ensemble des points de code Unicode considérés comme des espaces, équivalant à _"[[:space:]]"
_, _"\\s"
_ et space()
. Pour les remplacements d’expressions régulières plus complexes, il existe également _stri_replace_all_regex
_.
stringi
a également fonctions de trim .
_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
_
Je viens d’apprendre que le paquetage "stringr" supprime l’espace blanc au début et à la fin d’une chaîne avec str_trim (, side = "both"), mais il a également une fonction de remplacement qui permet:
a <- " xx yy 11 22 33 "
str_replace_all(string=a, pattern=" ", repl="")
[1] "xxyy112233"
Utilisez [[:blank:]]
pour faire correspondre tout type de caractère horizontal.
gsub("[[:blank:]]", "", " xx yy 11 22 33 ")
# [1] "xxyy112233"
S'il vous plaît noter que les soultions écrites ci-dessus ne supprime que l'espace. Si vous souhaitez également supprimer une tabulation ou une nouvelle ligne, utilisez stri_replace_all_charclass
du package stringi
.
library(stringi)
stri_replace_all_charclass(" ala \t ma \n kota ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
x = "xx yy 11 22 33"
gsub(" ", "", x)
> [1] "xxyy112233"
La fonction str_squish()
du paquet stringr
de tidyverse fait la 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
De cette façon, vous pouvez supprimer tous les espaces de toutes les variables de caractère de votre cadre de données. Si vous préférez ne choisir que certaines des variables, utilisez mutate
ou 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)