it-swarm.com.de

Wie schneide ich führende und nachfolgende Leerzeichen ab?

Ich habe einige Probleme mit führenden und nachfolgenden Leerzeichen in einem data.frame. Ich schaue mir zB gerne ein bestimmtes row in einem data.frame An, das auf einer bestimmten Bedingung basiert:

> 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 erhalten habe, da das Land Österreich offensichtlich in meinem data.frame Existiert. Nachdem ich meinen Code-Verlauf durchgesehen und versucht hatte, herauszufinden, was schief gelaufen war, versuchte ich:

> 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

Ich habe im Befehl lediglich ein zusätzliches Leerzeichen nach Österreich geändert.

Weitere ärgerliche Probleme treten offensichtlich auf. Zum Beispiel, wenn ich zwei Frames basierend auf der Länderspalte zusammenführen möchte. Ein data.frame Verwendet "Austria ", Während der andere Frame "Austria" Enthält. Der Abgleich funktioniert nicht.

  1. Gibt es eine gute Möglichkeit, das Leerzeichen auf meinem Bildschirm anzuzeigen, damit ich auf das Problem aufmerksam werde?
  2. Und kann ich das führende und nachfolgende Leerzeichen in R entfernen?

Bisher habe ich ein einfaches Perl Skript geschrieben, das das Leerzeichen entfernt, aber es wäre schön, wenn ich es irgendwie in R machen könnte.

339
mropa

Wahrscheinlich ist es am besten, die nachgestellten Leerzeichen beim Lesen Ihrer Datendatei zu verarbeiten. Wenn du benutzt read.csv oder read.table Sie können den Parameter einstellenstrip.white=TRUE.

Wenn Sie die Zeichenfolgen anschließend bereinigen möchten, können Sie eine der folgenden 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)

So verwenden Sie eine dieser Funktionen für myDummy$country:

 myDummy$country <- trim(myDummy$country)

So zeigen Sie das Leerzeichen an, das Sie verwenden können:

 paste(myDummy$country)

hier sehen Sie die Zeichenfolgen, die in Anführungszeichen (") gesetzt sind, um das Erkennen von Leerzeichen zu erleichtern.

441
f3lix

Ab R 3.2.0 wurde eine neue Funktion zum Entfernen von führenden/nachfolgenden Leerzeichen eingeführt:

trimws()

Siehe: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html

497
wligtenberg

Verwenden Sie zum Bearbeiten des Leerraums str_trim () im Paket stringr. Das Paket hat Handbuch vom 15.02.2013 und ist in CRAN. Die Funktion kann auch Zeichenfolgenvektoren verarbeiten.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(Lob geht an Kommentator: R. Cotton)

85
userJT

Ein einfaches Funktion, um führende und nachfolgende Leerzeichen zu entfernen:

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

Verwendung:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"
23

ad1) Um Leerzeichen zu sehen, können Sie direkt print.data.frame mit modifizierten Argumenten:

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 ?print.data.frame für andere Optionen.

11
Marek

Verwenden Sie grep oder grepl, um Beobachtungen mit Leerzeichen zu finden, und sub, 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"  

Ich würde es vorziehen, die Antwort als Kommentar zu user56 hinzuzufügen, kann sie jedoch nicht als unabhängige Antwort schreiben. Das Entfernen von führenden und nachfolgenden Leerzeichen kann auch durch die trim () - Funktion aus dem gdata-Paket erreicht werden:

require(gdata)
example(trim)

Anwendungsbeispiel:

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

Eine andere Möglichkeit ist die Verwendung der Funktion stri_trim Aus dem Paket stringi, die standardmäßig führende und nachfolgende Leerzeichen entfernt:

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

Verwenden Sie stri_trim_left, Um nur führende Leerzeichen zu entfernen. Verwenden Sie stri_trim_right, Um nur nachfolgende Leerzeichen zu entfernen. Wenn Sie andere führende oder nachfolgende Zeichen entfernen möchten, müssen Sie dies mit pattern = Angeben.

Siehe auch ?stri_trim Für weitere Informationen.

5
Jaap

Ein anderes verwandtes Problem tritt auf, wenn Sie mehrere Leerzeichen zwischen Eingaben haben:

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

Sie können diese Zeichenfolge dann einfach in "echte" Token aufteilen, indem Sie einen regulären Ausdruck für das Argument split verwenden:

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

Beachten Sie, dass, wenn am Anfang einer (nicht leeren) Zeichenfolge eine Übereinstimmung vorliegt, das erste Element der Ausgabe "" "lautet. Wenn jedoch am Ende der Zeichenfolge eine Übereinstimmung vorliegt, ist die Ausgabe dieselbe wie mit dem Streichholz entfernt.

4
TMOTTM

Ich habe eine trim.strings () -Funktion erstellt, um führende und/oder nachfolgende Leerzeichen wie folgt zu trimmen:

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

Ich habe es mit trim () versucht. Funktioniert gut mit Leerzeichen und dem '\ n'. x = '\ n Harden, J.\n'

trimmen (x)

1
J.Dan

Beste Methode ist trimws ()

Der folgende Code wendet diese Funktion auf den gesamten Datenrahmen an

mydataframe <- data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSE)

1
Santosh Kadge
myDummy[myDummy$country == "Austria "] <- "Austria"

Danach musst du R zwingen, "Österreich" nicht als Level zu erkennen. Stellen wir uns vor, Sie haben auch "USA" und "Spanien" als Level:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

Ein bisschen weniger einschüchternd als die Antwort mit der höchsten Stimmenzahl, aber es sollte trotzdem funktionieren.

0
David Mitchell