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.
- czy istnieje dobry sposób na "pokazanie" białej spacji na moim ekranie, abym był świadomy problemu?
- 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.
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.
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
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)
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"
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.
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"
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"
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.
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.
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"
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
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ć.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)
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