Как удалить все пробелы из строки?

Ответы:

258

В общем, мы хотим, чтобы решение было векторизованным, поэтому вот лучший пример теста:

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

Базовый подход R: gsub

gsubзаменяет все экземпляры строки ( fixed = TRUE) или регулярного выражения ( fixed = FALSEпо умолчанию) другой строкой. Чтобы удалить все пробелы, используйте:

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

Как отметил DWin, в этом случае fixed = TRUE нет необходимости, но он обеспечивает немного лучшую производительность, поскольку сопоставление с фиксированной строкой происходит быстрее, чем сопоставление с регулярным выражением.

Если вы хотите удалить все типы пробелов, используйте:

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:]"R-специфичная группа регулярных выражений, соответствующая всем пробелам \sявляется независимым от языка регулярным выражением, которое делает то же самое.


stringrПодход: str_replace_allиstr_trim

stringrпредоставляет более понятные человеку обертки для базовых функций R (хотя по состоянию на декабрь 2014 года версия разработки имеет ветку, построенную поверх stringiупомянутой ниже). Эквивалентами вышеприведенных команд, использующих [ str_replace_all][3], являются:

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

stringrтакже имеет str_trimфункцию, которая удаляет только начальные и конечные пробелы.

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иstri_trim

stringiпостроен на независимой от платформы библиотеке ICU и имеет обширный набор функций для работы со строками. Эти эквиваленты вышеуказанных являются:

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

Вот "\\p{WHITE_SPACE}"альтернативный синтаксис для множества кодовых точек Unicode считаются пробелами, что эквивалентно "[[:space:]]", "\\s"и space(). Для более сложных замен регулярных выражений, также есть stri_replace_all_regex.

stringiтакже имеет функции обрезки .

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
Анико
источник
2
@Aniko. Есть ли причина, по которой вы использовали fixed = TRUE?
IRTFM
2
@DWin Возможно, это быстрее, если R знает, что ему не нужно вызывать регулярные выражения. В этом случае это на самом деле не имеет никакого значения, я просто привык это делать.
Анико
Есть ли разница между "[[:space:]]"и "\\s"?
Саша Эпскамп
5
если вы проверите на flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters или просто наберете ? regex, то вы увидите, что [: space:] используется для «Пробелы: табуляция, перевод строки» , вертикальная табуляция, подача формы, возврат каретки и пробел. " Это намного больше, чем просто пространство
сэр Ксилем,
1
@Aniko Надеюсь, ты не против большого редактирования. Поскольку этот вопрос очень популярен, похоже, что ответ должен быть более тщательным.
Ричи Коттон
18

Я только что узнал о пакете "stringr" для удаления пробелов из начала и конца строки с помощью str_trim (, side = "both"), но у него также есть функция замены, так что:

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

[1] "xxyy112233"
Веселый Роджер
источник
3
Пакет stringr не работает хорошо с каждой кодировкой. пакет stringi - лучшее решение, для получения дополнительной информации проверьте github.com/Rexamine/stringi
bartektartanus
8

Обратите внимание, что вышеперечисленные заголовки удаляют только пробел. Если вы также хотите удалить вкладку или новую строку, используйте stri_replace_all_charclassиз stringiпакета.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
bartektartanus
источник
4
stringiпакет на CRAN сейчас, наслаждайтесь! :)
bartektartanus
1
Эта команда выше неверна. Правильный путь - stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Лукас Фортини
5
После использования stringiв течение нескольких месяцев и наблюдения / изучения того, насколько он мощен и эффективен, он стал моим основным пакетом для операций со строками. Вы, ребята, проделали потрясающую работу с этим.
Рич Скривен
7

Используйте, [[:blank:]]чтобы соответствовать любому виду горизонтальных символов white_space.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"
Авинаш Радж
источник
6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
источник
4

Функция str_squish()из пакета stringrTidyverse делает волшебство!

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
источник
4
Пожалуйста, не связывайтесь с кодом. Добавьте его в текстовое тело вашего ответа и объясните здесь, чтобы придать вашему ответу более долгосрочную ценность.
Р Баласубраманян
Спасибо @RBalasubramanian за напоминание об этом руководстве. Я буду следить за этим в будущем.
Дамианоолдони
Я не понимаю, как это отвечает на вопрос. str_squishне удаляет все пробелы Это только урезает и заменяет многократные пробелы для одного.
крапива
0

Таким образом, вы можете удалить все пробелы из всех символьных переменных в вашем фрейме данных. Если вы предпочитаете выбирать только некоторые из переменных, используйте mutateили 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
источник
-1

Из библиотеки stringr вы можете попробовать это:

  1. Удалить последовательные пробелы заполнения
  2. Удалить заполнить бланк

    библиотека (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Дата Жюль
источник