web-dev-qa-db-fra.com

Comment supprimer tous les espaces d'une chaîne?

Donc, " xx yy 11 22 33 " deviendra "xxyy112233". Comment puis-je atteindre cet objectif?

128
waanders

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
_

L’approche de base R: 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.


L'approche 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      
_

L'approche 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
_
220
Aniko

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"
17
JollyRoger

Utilisez [[:blank:]] pour faire correspondre tout type de caractère horizontal.

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

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"
7
bartektartanus
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
6
ZWL

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
4
damianooldoni

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 mutateou 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)

0
NinaOtopal