Вопрос

У меня возникли некоторые проблемы с начальными и конечными пробелами в 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

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

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

  1. Есть ли хороший способ "показать" пробел на моем экране, чтобы я знал о проблеме?
  2. И могу ли я удалить начальный и конечный пробелы в R?

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

Это было полезно?

Решение

Вероятно, лучший способ — обработать конечные пробелы при чтении файла данных.Если вы используете 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, но пока не могу написать как независимый ответ.Удаление начальных и конечных пробелов также может быть достигнуто с помощью функции обрезки() из пакета gdata:

require(gdata)
example(trim)

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

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

Другой вариант — использовать 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 для получения дополнительной информации.

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

> 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"

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

Я создал 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"   

Лучший метод — Trimw()

Следующий код применит эту функцию ко всему кадру данных.

mydataframe<- data.frame(lapply(mydataframe, Trimws),stringsAsFactors = FALSE)

Я попробовал обрезку().Хорошо работает с пробелами, а также с символом « ».x = ' Харден, Дж. '

обрезка (х)

myDummy[myDummy$country == "Austria "] <- "Austria"

После этого вам нужно будет заставить R не распознавать «Австрию» как уровень.Давайте представим, что у вас также есть уровни «США» и «Испания»:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

Немного менее устрашающе, чем ответ, получивший наибольшее количество голосов, но он все равно должен сработать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top