Jak przycinać początkowe i końcowe białe znaki?

Mam pewne problemy z wiodącymi i końcowymi białymi spacjami w danych.rama. Np. chciałbym przyjrzeć się konkretnemu row w data.frame na podstawie pewnego warunku:

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

Zastanawiałem się, dlaczego nie dostałem oczekiwanej produkcji, ponieważ kraj Austria oczywiście istniał w moim data.frame. Po przejrzeniu mojej historii kodu i spróbowaniu dowiedzieć się, co poszło nie tak, próbowałem:

> 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

Wszystko, co zmieniłem w poleceniu, to dodatkowe białe spacje po Austrii.

Pojawiają się oczywiście kolejne irytujące problemy. Np. gdy Lubię łączyć dwie ramki na podstawie kolumny country. Jedna data.frame używa "Austria ", podczas gdy druga ramka ma "Austria". Dopasowanie nie działa.

  1. czy istnieje dobry sposób na "pokazanie" białej spacji na moim ekranie, abym był świadomy problemu?
  2. i czy mogę usunąć początkowe i końcowe białe spacje w R?

Do tej pory pisałem prosty Perl skrypt, który Usuwa spacje, ale byłoby miło jeśli uda mi się jakoś to zrobić w R.

Author: Jaap, 2010-02-14

13 answers

Prawdopodobnie najlepszym sposobem jest radzenie sobie z końcowymi białymi spacjami podczas czytania pliku danych. Jeśli używasz read.csv lub read.table możesz ustawić parametr strip.white=TRUE.

Jeśli chcesz potem wyczyścić łańcuchy, możesz użyć jednej z następujących funkcji:

# 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)

Aby użyć jednej z tych funkcji na myDummy$country:

 myDummy$country <- trim(myDummy$country)

Aby "pokazać" białe znaki, których możesz użyć:

 paste(myDummy$country)

Który pokaże Ci ciągi znaków otoczonych cudzysłowami ( " ), co ułatwi dostrzeżenie białych spacji.

 406
Author: f3lix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 17:07:41

Od wersji R 3.2.0 wprowadzono nową funkcję do usuwania początkowych/końcowych spacji:

trimws()

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

 458
Author: wligtenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 19:40:49

Aby manipulować białą spacją, użyj str_trim () w pakiecie stringr. Pakiet ma instrukcję z dnia 15 lutego 2013 i jest w CRAN. Funkcja może również obsługiwać wektory łańcuchowe.

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

(kredyt idzie do komentatora: R. Cotton)

 79
Author: userJT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 16:30:06

Prosta Funkcja do usuwania początkowych i końcowych białych znaków:

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

Użycie:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"
 21
Author: Bernhard Kausler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 13:37:24

Ad1) aby zobaczyć białe spacje można bezpośrednio wywołać {[1] } ze zmodyfikowanymi argumentami:

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"

Zobacz także ?print.data.frame dla innych opcji.

 10
Author: Marek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 10:00:20

Użyj grep lub grepl, aby znaleźć obserwacje z białymi spacjami i sub, aby się ich pozbyć.

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"  
 8
Author: Jyotirmoy Bhattacharya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 14:13:46

Wolałbym dodać odpowiedź jako komentarz do user56, ale jednak nie mogę tak pisać jako niezależna odpowiedź. Usunięcie pierwszych i końcowych spacji może być również osiągnięte poprzez funkcję trim () z pakietu gdata:

require(gdata)
example(trim)

Przykład użycia:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"
 5
Author: KAA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 00:29:05

Inną opcją jest użycie funkcji stri_trim z pakietu stringi, która domyślnie usuwa początkowe i końcowe białe znaki:

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

Do usuwania tylko wiodących białych znaków, użyj stri_trim_left. Aby usunąć tylko końcowe spacje, użyj stri_trim_right. Jeśli chcesz usunąć inne znaki początkowe lub końcowe, musisz to określić za pomocą pattern =.

Zobacz także ?stri_trim aby uzyskać więcej informacji.

 5
Author: Jaap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-14 16:55:53

Inny powiązany problem występuje, jeśli w wejściach jest wiele spacji:

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

Można następnie łatwo podzielić ten łańcuch na "prawdziwe" tokeny używając wyrażenia regularnego do argumentu split:

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

Zauważ, że jeśli jest dopasowanie na początku (niepustym) łańcuchem, pierwszym elementem wyjścia jest'""', ale jeśli na końcu łańcucha znajduje się dopasowanie, wynikiem jest tak samo jak z usuniętym meczem.

 4
Author: TMOTTM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-13 11:13:59

Utworzyłem trim.strings () funkcję do przycinania początkowych i / lub końcowych białych znaków jako:

# 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)
    } 
} 

Na ilustrację,

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"   
 1
Author: Bryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 10:27:58

Najlepszą metodą jest trimws ()

Następujący kod zastosuje tę funkcję do całej ramki danych

Mydataframe

 1
Author: Santosh Kadge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 09:01:34
myDummy[myDummy$country == "Austria "] <- "Austria"

Po tym, będziesz musiał zmusić R, aby nie rozpoznał "Austria" jako poziom. Załóżmy, że masz również" USA "i" Hiszpania " jako poziomy: {]}

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
Trochę mniej onieśmielająca niż najwyższa głosowana odpowiedź, ale i tak powinna działać.
 0
Author: David Mitchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 15:15:18

Próbowałem trim (). Działa dobrze z białymi spacjami, a także "\n". x = "\n", J.\N "

Trim (x)

 0
Author: J.Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 07:46:06