Jak przycinać białe spacje prowadzące i końcowe?

Mam pewne problemy z prowadzeniem i ciągiem białej przestrzeni w danych.rama.

Na przykład, lubię spojrzeć na konkretny 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 dodatkowy miejsce po Austrii.

Pojawiają się oczywiście kolejne irytujące problemy. Na przykład, gdy Lubię łączyć dwie ramki w oparciu o kolumnę kraj. 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 przestrzeni na ekranie, abym był świadomy problemu?
  2. i czy mogę usunąć wiodącą i końcową białą spację w R?

Do tej pory pisałem prosty Perl skrypt, który usuwa Tempo białych, ale byłoby miło, gdybym mógł jakoś to zrobić wewnątrz R.

Author: Peter Mortensen, 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 without leading white space
trim.leading <- function (x)  sub("^\\s+", "", x)

# Returns string without trailing white space
trim.trailing <- function (x) sub("\\s+$", "", x)

# Returns string without leading or trailing white space
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łą spację, której możesz użyć:

 paste(myDummy$country)

Który pokaże Ci ciągi znaków otoczonych cudzysłowami ( " ), dzięki czemu białe spacje będą łatwiejsze do zauważenia.

 467
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
2020-08-23 23:29:43

Od R 3.2.0 wprowadzono nową funkcję do usuwania wiodących / końcowych białych spacji:

trimws()

Zobacz: Usuń Początkowe / Końcowe Białe Spacje

 536
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
2020-08-31 21:11:04

Aby manipulować białą spacją, użyj str_trim () w pakiecie stringr. Pakiet ma manual z 15 lutego 2013 roku i znajduje się 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)

 91
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
2020-08-31 21:08:35

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

Ad 1) 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.

 12
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
2020-09-02 09:37:50

Użycie grep lub grepl aby znaleźć obserwacje z białymi przestrzeniami i sub żeby 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"
 10
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
2020-08-23 23:37:10

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"

wolałbym dodać odpowiedź jako komentarz do user56, ale nie jestem jeszcze w stanie tak pisać jako niezależna odpowiedź.

 8
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
2020-08-31 21:09:28

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.

 6
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 pomiędzy wejściami znajduje się 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 na początku (niepustego) łańcucha jest dopasowanie, pierwszym elementem wyjścia jest'"", ale jeśli na końcu łańcucha jest dopasowanie, to wyjście jest takie samo jak po usunięciu dopasowania.

 6
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
2020-08-31 21:13:55

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"   
 3
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 () .

Poniższy kod zastosuje tę funkcję do całej ramki danych.

mydataframe<- data.frame(lapply(mydataframe, trimws),stringsAsFactors = FALSE)
 2
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
2020-08-31 21:18:01

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

x = '\n              Harden, J.\n              '

trim(x)
 2
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
2020-08-31 21:18:37
myDummy[myDummy$country == "Austria "] <- "Austria"

Po tym, będziesz musiał wymusić, aby R nie rozpoznał "Austria " jako poziomu. Załóżmy, że masz również "USA" i "Spain" jako poziomy:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
To trochę mniej onieśmielające niż najwyższa głosowana odpowiedź, ale nadal powinno działać.
 1
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
2020-09-02 09:50:56