Как обрезать начальные и конечные пробелы? - PullRequest
335 голосов
/ 14 февраля 2010

У меня проблемы с начальным и конечным пробелами в data.frame. Например, я хотел бы взглянуть на конкретную row в data.frame на основе определенного условия:

> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] 

[1] codeHelper     country        dummyLI    dummyLMI       dummyUMI       
[6] dummyHInonOECD dummyHIOECD    dummyOECD      
<0 rows> (or 0-length row.names)

Мне было интересно, почему я не получил ожидаемый результат, поскольку страна, очевидно, существовала в Австрии в моем data.frame. После просмотра истории кода и попытки выяснить, что пошло не так, я попытался:

> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
   codeHelper  country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18        AUT Austria        0        0        0              0           1
   dummyOECD
18         1

Все, что я изменил в команде, это дополнительный пробел после Австрии.

Дальнейшие досадные проблемы, очевидно, возникают. Например, когда мне нравится объединять два кадра на основе столбца страны. Один data.frame использует "Austria ", в то время как другой кадр имеет "Austria". Соответствие не работает.

  1. Есть ли хороший способ «показать» пробел на моем экране, чтобы я знал о проблеме?
  2. А можно ли убрать начальные и конечные пробелы в R?

До сих пор я писал простой Perl скрипт, который удаляет пробелы, но было бы неплохо, если бы я мог как-то сделать это внутри R.

Ответы [ 13 ]

487 голосов
/ 13 мая 2015

Начиная с версии 3.2.0, была введена новая функция для удаления начальных / конечных пробелов:

trimws()

См .: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html

436 голосов
/ 14 февраля 2010

Вероятно, лучший способ - обработать конечные пробелы при чтении файла данных. Если вы используете read.csv или read.table, вы можете установить параметр strip.white=TRUE.

Если вы хотите очистить строки после этого, вы можете использовать одну из следующих функций:

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

Чтобы использовать одну из этих функций на myDummy$country:

 myDummy$country <- trim(myDummy$country)

Чтобы «показать» пробел, который вы можете использовать:

 paste(myDummy$country)

, который покажет вам строки, заключенные в кавычки ("), чтобы упростить поиск пробелов.

84 голосов
/ 21 февраля 2013

Чтобы манипулировать пробелами, используйте str_trim () в пакете stringr.Пакет имеет руководство от 15 февраля 2013 г. и находится в CRAN.Функция также может обрабатывать строковые векторы.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(кредит идет к комментатору: Р. Коттон)

23 голосов
/ 19 февраля 2014

Простая функция для удаления начальных и конечных пробелов:

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

Использование:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"
11 голосов
/ 15 февраля 2010

ad1) Чтобы увидеть пробелы, вы можете напрямую вызвать print.data.frame с измененными аргументами:

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

См. Также ?print.data.frame для других опций.

9 голосов
/ 14 февраля 2010

Используйте grep или grepl, чтобы найти наблюдения с пробелами и sub, чтобы избавиться от них.

names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1]  TRUE FALSE  TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"  
5 голосов
/ 14 января 2016

Другой вариант - использовать функцию stri_trim из пакета stringi, которая по умолчанию удаляет начальные и конечные пробелы:

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"

Для удаления только начальных пробелов используйте stri_trim_left. Для удаления только конечных пробелов используйте stri_trim_right. Если вы хотите удалить другие начальные или конечные символы, вы должны указать это с помощью pattern =.

См. Также ?stri_trim для получения дополнительной информации.

5 голосов
/ 15 января 2015

Я бы предпочел добавить ответ в качестве комментария для user56, но пока не могу писать в качестве независимого ответа. Удаление ведущих и конечных пробелов может быть достигнуто с помощью функции trim () из пакета gdata:

require(gdata)
example(trim)

Пример использования:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"
4 голосов
/ 13 августа 2015

Другая связанная проблема возникает, если у вас есть несколько пробелов между входами:

> a <- "  a string         with lots   of starting, inter   mediate and trailing   whitespace     "

Затем вы можете легко разбить эту строку на «настоящие» токены, используя регулярное выражение для аргумента split:

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

Обратите внимание, что если в начале (непустая) строка, первый элемент вывода - "" ", но если есть совпадение в конце строки, вывод так же, как с удаленной спичкой.

1 голос
/ 16 сентября 2018

Я попытался обрезать (). Хорошо работает как с пробелами, так и с \ n. x = '\ n Harden, J. \ n'

отделка (х)

...