423 Stimmen

Wie kann ich vor- und nachlaufenden Leerraum abschneiden?

Ich habe einige Probleme mit führenden und nachgestellten Leerzeichen in einem data.frame.

Ich schaue mir zum Beispiel eine bestimmte row in einem data.frame auf der Grundlage einer bestimmten Bedingung:

> 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 habe mich gefragt, warum ich nicht die erwartete Ausgabe erhalte, da das Land Österreich in meiner Datenbank offensichtlich existiert. data.frame . Nachdem ich meinen Codeverlauf durchgesehen und versucht hatte, herauszufinden, was falsch gelaufen war, versuchte ich es:

> 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 in dem Befehl geändert habe, ist ein zusätzliches Leerzeichen nach Austria.

Es entstehen natürlich weitere lästige Probleme. Zum Beispiel, wenn ich zwei Rahmen auf der Basis der Länderspalte zusammenführen möchte. Einer data.frame verwendet "Austria " während der andere Rahmen "Austria" . Der Abgleich klappt nicht.

  1. Gibt es eine gute Möglichkeit, den Leerraum auf dem Bildschirm anzuzeigen, so dass ich mir des Problems bewusst bin?
  2. Und kann ich in R das führende und das nachgestellte Leerzeichen entfernen?

Bislang habe ich ein einfaches Perl Skript, das die weißen Stellen entfernt, aber es wäre schön, wenn ich das irgendwie in R machen könnte.

12voto

Utilice grep o grepl um Beobachtungen mit Leerzeichen zu finden und unter um sie loszuwerden.

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"

11voto

KAA Punkte 111

Das Entfernen führender und nachfolgender Leerzeichen kann auch mit der Funktion trim() aus dem gdata-Paket erreicht werden:

require(gdata)
example(trim)

Beispiel für die Verwendung:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

Am liebsten würde ich die Antwort als Kommentar zu der von user56 hinzufügen, aber ich bin noch nicht in der Lage, so als eigenständige Antwort zu schreiben.

7voto

Jaap Punkte 76587

Eine weitere Möglichkeit ist die Verwendung der stri_trim Funktion aus der stringi Paket, das standardmäßig führende und nachgestellte Leerzeichen entfernt:

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

Um nur führende Leerzeichen zu entfernen, verwenden Sie stri_trim_left . Um nur die Leerzeichen am Ende zu entfernen, verwenden Sie stri_trim_right . Wenn Sie andere führende oder nachgestellte Zeichen entfernen wollen, müssen Sie dies mit pattern = .

Siehe auch ?stri_trim für weitere Informationen.

6voto

TMOTTM Punkte 2982

Ein weiteres Problem tritt auf, wenn Sie mehrere Leerzeichen zwischen den Eingaben haben:

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

Sie können diese Zeichenkette dann ganz einfach in "echte" Token aufteilen, indem Sie einen regulären Ausdruck mit der split Argument:

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

Beachten Sie, dass bei einer Übereinstimmung am Anfang einer (nicht leeren) Zeichenkette das erste Element der Ausgabe '""' ist, bei einer Übereinstimmung am Ende der Zeichenkette ist die Ausgabe dieselbe wie ohne diese Übereinstimmung.

6voto

Bryan Punkte 31

Ich habe eine trim.strings () Funktion, um führende und/oder nachgestellte Leerzeichen zu kürzen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X