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.

  1. Gibt es eine schöne Art und Weise zu ‚Show‘ die Leerzeichen auf meinem Bildschirm, so dass ich das Problem bekannt bin?
  2. 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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top