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

152

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

waanders
la source

Réponses:

258

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

gsubremplace toutes les instances d'une chaîne ( fixed = TRUE) ou d'une expression régulière ( fixed = FALSEpar 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, ce fixed = TRUEn'est pas nécessaire mais offre des performances légèrement meilleures car la correspondance avec une chaîne fixe est plus rapide que la correspondance avec 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. \sest une expression régulière indépendante du langage qui fait la même chose.


L' stringrapproche: str_replace_alletstr_trim

stringrfournit des wrappers plus lisibles par l'homme autour des fonctions de base R (bien qu'à partir de décembre 2014, la version de développement ait une branche construite au-dessus stringi, mentionnée ci-dessous). Les équivalents des commandes ci-dessus, en utilisant [ str_replace_all][3], sont:

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

stringra également une str_trimfonction 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' stringiapproche: stri_replace_all_charclassetstri_trim

stringiest construit sur la bibliothèque ICU indépendante de la plate-forme et dispose d'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}", "")

Voici "\\p{WHITE_SPACE}"une syntaxe alternative pour l'ensemble des points de code Unicode considérés comme des espaces, équivalent à "[[:space:]]", "\\s"et space(). Pour les remplacements d'expressions régulières plus complexes, il existe également stri_replace_all_regex.

stringia également des fonctions de garniture .

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
la source
2
@Aniko. Y a-t-il une raison pour laquelle vous avez utilisé fixed = TRUE?
IRTFM
2
@DWin On suppose que c'est plus rapide si R sait qu'il n'a pas besoin d'invoquer l'expression régulière. Dans ce cas, cela ne fait vraiment aucune différence, j'ai juste l'habitude de le faire.
Aniko
Y a-t-il une différence entre "[[:space:]]"et "\\s"?
Sacha Epskamp
5
si vous vérifiez sur flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters ou tapez simplement? regex alors vous voyez que [: space:] est utilisé pour "Space characters: tab, newline , onglet vertical, saut de page, retour chariot et espace. " C'est beaucoup plus que l'espace seul
Sir Ksilem
1
@Aniko J'espère que la grande modification ne vous dérange pas. Étant donné que cette question est très populaire, il semblait que la réponse devait être plus approfondie.
Richie Cotton
18

Je viens d'apprendre le package "stringr" pour supprimer les espaces blancs du début et de la fin d'une chaîne avec str_trim (, side = "both") mais il a également une fonction de remplacement pour que:

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

[1] "xxyy112233"
JollyRoger
la source
3
Le package stringr ne fonctionne pas bien avec tous les encodages. Le package stringi est une meilleure solution, pour plus d'informations, consultez github.com/Rexamine/stringi
bartektartanus
8

Veuillez noter que les soultions écrites ci-dessus ne suppriment que l'espace. Si vous souhaitez également supprimer un onglet ou une nouvelle utilisation stri_replace_all_charclassde ligne du stringipackage.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
bartektartanus
la source
4
stringile paquet est sur CRAN maintenant, profitez-en! :)
bartektartanus
1
Cette commande ci-dessus est incorrecte. La bonne façon est stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini
5
Après avoir utilisé stringipendant quelques mois maintenant et vu / appris à quel point il est puissant et efficace, il est devenu mon package incontournable pour les opérations de chaîne. Vous avez fait un travail formidable avec.
Rich Scriven
7

Utilisation [[:blank:]] pour faire correspondre tout type de caractères d'espace blanc horizontal.

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

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
la source
4

La fonction str_squish()de package stringrde 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
damianooldoni
la source
4
Veuillez ne pas établir de lien avec le code. Ajoutez-le dans le corps du texte de votre réponse et expliquez-le ici, pour donner plus de valeur à votre réponse à long terme.
R Balasubramanian
Merci @RBalasubramanian de m'avoir rappelé cette directive. Je le suivrai dans le futur.
damianooldoni
Je ne vois pas comment cela répond à la question. str_squishne supprime pas tous les espaces. Il coupe simplement et remplace plusieurs espaces par un seul.
Nettle
0

De cette façon, vous pouvez supprimer tous les espaces de toutes les variables de caractères de votre bloc 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)
NinaOtopal
la source
-1

À partir de la bibliothèque stringr, vous pouvez essayer ceci:

  1. Supprimer les blancs de remplissage consécutifs
  2. Supprimer le blanc de remplissage

    bibliothèque (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Données Jules
la source