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