Jak usunąć wszystkie białe znaki z ciągu?

152

Tak " xx yy 11 22 33 "się stanie "xxyy112233". Jak mogę to osiągnąć?

wałki
źródło

Odpowiedzi:

258

Ogólnie rzecz biorąc, chcemy rozwiązania wektoryzowanego, więc oto lepszy przykład testowy:

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

Podstawowe podejście R: gsub

gsubzamienia wszystkie wystąpienia ciągu ( fixed = TRUE) lub wyrażenia regularnego ( fixed = FALSEdomyślne) na inny ciąg. Aby usunąć wszystkie spacje, użyj:

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

Jak zauważył DWin, w tym przypadku fixed = TRUEnie jest to konieczne, ale zapewnia nieco lepszą wydajność, ponieważ dopasowanie ustalonego ciągu jest szybsze niż dopasowanie wyrażenia regularnego.

Jeśli chcesz usunąć wszystkie rodzaje białych znaków, użyj:

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:]"jest specyficzną dla języka R grupą wyrażeń regularnych pasującą do wszystkich znaków spacji. \sjest niezależnym od języka wyrażeniem regularnym, które robi to samo.


stringrPodejście: str_replace_allastr_trim

stringrzapewnia bardziej czytelne dla człowieka otoki wokół podstawowych funkcji języka R (chociaż od grudnia 2014 r. wersja rozwojowa ma wbudowaną gałąź stringi, o której mowa poniżej). Odpowiednikami powyższych poleceń, używając [ str_replace_all][3], są:

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

stringrposiada również str_trimfunkcję, która usuwa tylko początkowe i końcowe spacje.

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      

stringiPodejście: stri_replace_all_charclassastri_trim

stringijest zbudowany na niezależnej od platformy bibliotece ICU i posiada obszerny zestaw funkcji manipulowania ciągami znaków. W równoważniki powyżej wymienionych związków są:

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

Tutaj "\\p{WHITE_SPACE}"jest alternatywną składnię dla zbioru punktów kodowych Unicode uznawanych za białe znaki, co odpowiada "[[:space:]]", "\\s"a space(). W przypadku bardziej złożonych zamiany wyrażeń regularnych istnieje również stri_replace_all_regex.

stringiposiada również funkcje przycinania .

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
źródło
2
@Aniko. Czy jest jakiś powód, dla którego użyłeś fixed = TRUE?
IRTFM
2
@DWin Podobno szybciej jest, gdy R wie, że nie musi wywoływać wyrażeń regularnych. W tym przypadku nie robi to żadnej różnicy, po prostu mam taki zwyczaj.
Aniko
Czy jest różnica między "[[:space:]]"i "\\s"?
Sacha Epskamp
5
jeśli zaznaczysz flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters lub po prostu wpiszesz? regex, zobaczysz, że [: space:] jest używane dla „Space characters: tab, newline , tabulator pionowy, wysuw strony, powrót karetki i spacja. " To znacznie więcej niż sama przestrzeń kosmiczna
Sir Ksilem
1
@Aniko Mam nadzieję, że nie przejmujesz się dużą zmianą. Ponieważ to pytanie jest bardzo popularne, wyglądało na to, że odpowiedź musiała być dokładniejsza.
Richie Cotton
18

Właśnie dowiedziałem się o pakiecie „stringr” do usuwania białych znaków z początku i końca ciągu za pomocą str_trim (, side = „both”), ale ma on również funkcję zastępującą, dzięki czemu:

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

[1] "xxyy112233"
Jolly Roger
źródło
3
Pakiet stringr nie działa dobrze z każdym kodowaniem. Pakiet stringi jest lepszym rozwiązaniem, więcej informacji znajdziesz na github.com/Rexamine/stringi
bartektartanus
8

Zwróć uwagę, że napisane powyżej słowa usuwają tylko spację. Jeśli chcesz również usunąć tabulację lub nową linię, użyj stri_replace_all_charclassz stringipakietu.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
bartektartanus
źródło
4
stringipakiet jest teraz na CRAN, ciesz się! :)
bartektartanus
1
To polecenie powyżej jest nieprawidłowe. Właściwa droga to stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini,
5
Po stringikilku miesiącach używania i zobaczeniu / nauczeniu się, jak potężny i wydajny jest on, stał się moim podstawowym pakietem do operacji na strunach. Wykonaliście z tym świetną robotę.
Rich Scriven
7

Służy [[:blank:]]do dopasowywania dowolnych poziomych znaków białej spacji.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"
Avinash Raj
źródło
6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
źródło
4

Funkcja str_squish()z pakietu stringrtidyverse robi magię!

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
źródło
4
Nie umieszczaj linków do kodu. Dodaj to w treści swojej odpowiedzi i wyjaśnij tutaj, aby nadać odpowiedzi bardziej długoterminową wartość.
R Balasubramanian
Dzięki @RBalasubramanian za przypomnienie mi o tej wytycznej. Będę to śledzić w przyszłości.
damianooldoni
Nie rozumiem, jak to odpowiada na pytanie. str_squishnie usuwa wszystkich spacji. Po prostu przycina i zastępuje wiele spacji.
Pokrzywa
0

W ten sposób możesz usunąć wszystkie spacje ze wszystkich zmiennych znakowych w ramce danych. Jeśli wolisz wybrać tylko niektóre zmienne, użyj mutatelub 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
źródło
-1

Z biblioteki stringr możesz spróbować tego:

  1. Usuń kolejne puste wypełnienia
  2. Usuń puste wypełnienie

    biblioteka (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Data Jules
źródło