Wie zu trimmen Leerzeichen Vorder- und Hinter?
-
20-09-2019 - |
Frage
Ich habe einige Probleme mit dem führenden und nachfolgenden Leerzeichen in einem data.frame.
ZB Ich mag einen Blick auf einen bestimmten row
in einem data.frame
auf einer bestimmten Bedingung basierend nehmen:
> 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)
ich mich gefragt, warum ich nicht die erwartete Ausgabe seit dem Land bekommen haben offensichtlich Österreich in meinem data.frame
existierte. Nach einem Blick durch meine Code Geschichte und versuchen, herauszufinden, was schief gelaufen ist Ich habe versucht:
> 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
Alles, was ich habe in dem Befehl geändert wird eine zusätzliche Leerzeichen nach Österreich.
Weitere lästige Probleme offensichtlich entstehen. Zum Beispiel, wenn Ich mag zwei Frames auf dem Land Spalte basiert verschmelzen. Eine data.frame
Anwendungen "Austria "
, während der andere Rahmen "Austria"
hat. Die passende funktioniert nicht.
- Gibt es eine schöne Art und Weise zu ‚Show‘ die Leerzeichen auf meinem Bildschirm, so dass ich das Problem bekannt bin?
- Und kann ich entfernen Sie die führende und nachfolgende Leerzeichen in R?
Bisher habe ich ein einfaches Perl
Skript zu schreiben, die die Leerzeichen entfernt, aber es wäre schön, wenn ich es irgendwie innen R tun können.
Lösung
Wahrscheinlich ist der beste Weg, um die hinteren Leerzeichen zu handhaben, wenn Sie Ihre Datendatei zu lesen. Wenn Sie read.csv
verwenden oder read.table
Sie die parameterstrip.white=TRUE
einstellen können.
Wenn Sie wollen saubere Saiten danach Sie eine dieser Funktionen verwenden:
# 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)
Um eine dieser Funktionen auf myDummy$country
verwenden:
myDummy$country <- trim(myDummy$country)
'Show' die Leerzeichen Sie verwenden:
paste(myDummy$country)
, die Ihnen die Saiten von Anführungszeichen umgeben zeigen ( ") macht Whitespaces leichter zu erkennen.
Andere Tipps
Ab R 3.2.0 eine neue Funktion wurde zum Entfernen von Vorder- / Hinter Leerzeichen eingeführt:
trimws()
Siehe auch: http: // stat. ethz.ch/R-manual/R-patched/library/base/html/trimws.html
Um den Leerraum, Verwendung str_trim () in dem stringr Paket zu manipulieren. Das Paket hat manuellen datiert Februar 15,2013 und ist in CRAN. Die Funktion kann auch String-Vektoren behandeln.
install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)
(Kredit Kommentator geht: R. Cotton)
Ein einfacher Funktion entfernen führende und nachfolgende Leerzeichen:
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
Verwendung:
> text = " foo bar baz 3 "
> trim(text)
[1] "foo bar baz 3"
ad1) weißen Räumen zu sehen, direkt print.data.frame
mit modifizierten Argumente nennen könnte:
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"
Siehe auch für andere Optionen ?print.data.frame
.
Verwenden Sie grep oder Grepl finden Beobachtungen mit Leerzeichen und Unter sie los zu bekommen.
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"
Am liebsten würde ich die Antwort als Kommentar zu user56 hinzufügen, aber noch nicht in der Lage, so schreiben als eigenständige Antwort. Entfernen von führenden und nachfolgenden Leerzeichen könnte auch durch trim () Funktion von gdata Paket erreicht werden:
require(gdata)
example(trim)
Anwendungsbeispiel:
> trim(" Remove leading and trailing blanks ")
[1] "Remove leading and trailing blanks"
Eine andere Möglichkeit ist es, die stri_trim
Funktion aus dem stringi
Paket zu verwenden, die Standardeinstellungen zu entfernen führende und nachfolgende Leerzeichen:
> x <- c(" leading space","trailing space ")
> stri_trim(x)
[1] "leading space" "trailing space"
Für nur führende Leerzeichen zu entfernen, verwenden stri_trim_left
. Nur für nachfolgende Leerzeichen entfernen, Verwendung stri_trim_right
. Wenn Sie möchten, dass andere entfernen Zeichen am Anfang oder Ende, müssen Sie festlegen, dass mit pattern =
.
Siehe auch für weitere Informationen ?stri_trim
.
Ein weiteres verwandtes Problem tritt auf, wenn Sie mehrere Räume dazwischen Eingänge haben:
> a <- " a string with lots of starting, inter mediate and trailing whitespace "
Sie können dann diese Zeichenfolge leicht aufgeteilt in „echten“ Token einen regulären Ausdruck zum split
Argumente:
> strsplit(a, split=" +")
[[1]]
[1] "" "a" "string" "with" "lots"
[6] "of" "starting," "inter" "mediate" "and"
[11] "trailing" "whitespace"
Beachten Sie, dass, wenn es eine Übereinstimmung am Anfang ein (nicht leer) string, das erste Element des Ausgangs ‚‚‘‘, aber wenn es eine Übereinstimmung am Ende der Schnur ist, ist der Ausgang der wie bei entfernt das Spiel.
Ich habe eine trim.strings ()
Funktion zu trimmen führende und / oder nachfolgende Leerzeichen wie:
# 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)
}
}
Zur Veranschaulichung
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"
Beste Methode ist trimws ()
Code Nach wird diese Funktion gesamten Datenrahmen gilt
mydataframe <- data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSCH)
Ich habe versucht, trim (). Funktioniert gut mit weißen Räumen sowie die ‚\ n‘. x = '\ n Harden, J. \ n'
trim (x)
myDummy[myDummy$country == "Austria "] <- "Austria"
Danach werden Sie zu Kraft R brauchen nicht „Österreich“ als Ebene zu erkennen. Nehmen wir an, Sie auch „USA“ haben und „Spanien“ als Ebenen:
myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))
Ein bisschen weniger einschüchternd als die höchsten gestimmt Antwort, aber es sollte immer noch funktionieren.