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.

5voto

Icaro Bombonato Punkte 3292

Verwenden Sie dplyr/tidyverse mutate_all con str_trim um den gesamten Datenrahmen zu trimmen:

myDummy %>%
  mutate_all(str_trim)

library(tidyverse)
set.seed(335)
df <- mtcars %>%
        rownames_to_column("car") %>%
        mutate(car = ifelse(runif(nrow(mtcars)) > 0.4, car, paste0(car, " "))) %>%
        select(car, mpg)

print(head(df), quote = T)
#>                    car    mpg
#> 1         "Mazda RX4 " "21.0"
#> 2      "Mazda RX4 Wag" "21.0"
#> 3        "Datsun 710 " "22.8"
#> 4    "Hornet 4 Drive " "21.4"
#> 5 "Hornet Sportabout " "18.7"
#> 6           "Valiant " "18.1"

df_trim <- df %>%
  mutate_all(str_trim)

print(head(df_trim), quote = T)  
#>                   car    mpg
#> 1         "Mazda RX4"   "21"
#> 2     "Mazda RX4 Wag"   "21"
#> 3        "Datsun 710" "22.8"
#> 4    "Hornet 4 Drive" "21.4"
#> 5 "Hornet Sportabout" "18.7"
#> 6           "Valiant" "18.1"

Erstellt am 2021-05-07 von der Reprex-Paket (v0.3.0)

3voto

Santosh Kadge Punkte 73

Die beste Methode ist trimws() .

Mit dem folgenden Code wird diese Funktion auf den gesamten Datenrahmen angewendet.

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

2voto

David Mitchell Punkte 31
myDummy[myDummy$country == "Austria "] <- "Austria"

Danach müssen Sie R dazu zwingen, das Programm nicht zu erkennen. "Austria " als eine Ebene. Nehmen wir an, Sie haben auch "USA" y "Spain" als Ebenen:

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

Sie ist etwas weniger einschüchternd als die am häufigsten gewählte Antwort, sollte aber dennoch funktionieren.

1voto

tjebo Punkte 16842

Für alle, die es interessiert, hier ein einfaches Benchmarking. Dieser erfasst natürlich nicht alle seltsamen Fälle, aber bisher fehlt uns noch das Beispiel, bei dem str_trim entfernt Leerzeichen und trimws nicht ( siehe Richard Telfords Kommentar zu dieser Antwort ). Es scheint keine Rolle zu spielen - die gsub-Option scheint am schnellsten zu sein :)

x <- c(" lead", "trail ", " both ", " both and middle ", " _special")
gsub_trim <- function (x) gsub("^\\s+|\\s+$", "", x)
res <- microbenchmark::microbenchmark(
  gsub = gsub_trim(x),
  trimws = trimws(x),
  str_trim = stringr::str_trim(x),
  times = 10^5
)
res
#> Unit: microseconds
#>      expr    min     lq      mean median       uq       max neval cld
#>      gsub 20.201 22.788  31.43943 24.654  28.4115  5303.741 1e+05 a  
#>    trimws 38.204 41.980  61.92218 44.420  51.1810 40363.860 1e+05  b 
#>  str_trim 88.672 92.347 116.59186 94.542 105.2800 13618.673 1e+05   c
ggplot2::autoplot(res)

sessionInfo()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Big Sur 10.16
#> 
#> locale:
#> [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#>  stringr_1.4.0

0voto

J.Dan Punkte 43

Ich habe trim() ausprobiert. Es funktioniert gut mit Leerzeichen und auch mit dem ' \n '.

x = '\n              Harden, J.\n              '

trim(x)

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