Как обрезать начальные и конечные пробелы?
у меня возникли некоторые проблемы с ведущими и конечными пробелами в данных.рамка.
Например, мне нравится смотреть на конкретный 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"
. Совпадение не работает.
- есть ли хороший способ "показать" пробелы на моем экране, чтобы я знал о проблеме?
- и могу ли я удалить начальные и конечные пробелы в R?
до сих пор я писал a просто Perl
скрипт, который удаляет пробелы, но было бы неплохо, если бы я мог как-то сделать это внутри R.
13 ответов:
вероятно, лучший способ-обрабатывать конечные пробелы при чтении файла данных. Если вы используете
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)
, который покажет вам строки заключены в кавычки (") что делает пробелы легче обнаружить.
начиная с R 3.2.0 была введена новая функция для удаления ведущих / конечных пробелов:
trimws()
см.:http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
чтобы манипулировать пробелом, используйте str_trim () в пакете stringr. Пакет имеет руководство от 15 февраля 2013 года и находится в CRAN. Функция также может обрабатывать строковые векторы.
install.packages("stringr", dependencies=TRUE) require(stringr) example(str_trim) d4$clean2<-str_trim(d4$V2)
(кредит идет комментатору: Р. Коттон)
простой функции удалить начальные и конечные пробелы:
trim <- function( x ) { gsub("(^[[:space:]]+|[[:space:]]+$)", "", x) }
использование:
> text = " foo bar baz 3 " > trim(text) [1] "foo bar baz 3"
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
другие варианты.
используйте 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"
Я бы предпочел добавить ответ в качестве комментария к user56, но пока не могу писать как независимый ответ. Удаление ведущих и замыкающих пробелов может быть достигнуто с помощью функции trim () из пакета gdata:
require(gdata) example(trim)
пример использования:
> trim(" Remove leading and trailing blanks ") [1] "Remove leading and trailing blanks"
другая связанная проблема возникает, если у вас есть несколько пробелов между входами:
> a <- " a string with lots of starting, inter mediate and trailing whitespace "
затем вы можете легко разделить эту строку на" реальные " токены, используя регулярное выражение для :
> strsplit(a, split=" +") [[1]] [1] "" "a" "string" "with" "lots" [6] "of" "starting," "inter" "mediate" "and" [11] "trailing" "whitespace"
обратите внимание, что если есть совпадение в начале a (непустая) строка, первый элемент вывода'""', но если в конце строки есть совпадение, вывод будет следующим то же самое, что и с удаленным матчем.
Я создал
trim.strings ()
функция для обрезки ведущих и / или конечных пробелов как:# Arguments: x - character vector # side - side(s) on which to remove whitespace # default : "both" # possible values: c("both", "leading", "trailing") trim.strings <- function(x, side = "both") { if (is.na(match(side, c("both", "leading", "trailing")))) { side <- "both" } if (side == "leading") { sub("^\s+", "", x) } else { if (side == "trailing") { sub("\s+$", "", x) } else gsub("^\s+|\s+$", "", x) } }
для иллюстрации,
a <- c(" ABC123 456 ", " ABC123DEF ") # returns string without leading and trailing whitespace trim.strings(a) # [1] "ABC123 456" "ABC123DEF" # returns string without leading whitespace trim.strings(a, side = "leading") # [1] "ABC123 456 " "ABC123DEF " # returns string without trailing whitespace trim.strings(a, side = "trailing") # [1] " ABC123 456" " ABC123DEF"
myDummy[myDummy$country == "Austria "] <- "Austria"
после этого вам нужно будет заставить R не признавать "Австрию" как уровень. Давайте представим, что у вас также есть "США" и "Испания" в качестве уровней:
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
немного менее пугающим, чем самый высокий голос ответ, но он все равно должен работать.