Ich habe einige Probleme mit führenden und nachfolgenden Leerzeichen in einem data.frame. ZB schaue ich mir gerne einen bestimmten row
in data.frame
einem bestimmten Zustand an:
> 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 Leistung erhalten habe, da das Land Österreich offensichtlich in meinem Land existiert data.frame
. Nachdem ich meinen Codeverlauf 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
Alles, was ich im Befehl geändert habe, ist ein zusätzliches Leerzeichen nach Österreich.
Weitere störende Probleme treten offensichtlich auf. Zum Beispiel, wenn ich zwei Frames basierend auf der Länderspalte zusammenführen möchte. Einer data.frame
verwendet, "Austria "
während der andere Rahmen hat "Austria"
. Das Matching funktioniert nicht.
- Gibt es eine gute Möglichkeit, das Leerzeichen auf meinem Bildschirm anzuzeigen, damit ich mir des Problems bewusst werde?
- Und kann ich das führende und nachfolgende Leerzeichen in R entfernen?
Bisher habe ich ein einfaches Perl
Skript geschrieben, das Leerzeichen entfernt, aber es wäre schön, wenn ich es irgendwie in R tun könnte.
sub()
auch diePerl
Notation verwendet wird. Das tut mir leid. Ich werde versuchen, die Funktion zu verwenden. Aber für meine erste Frage habe ich noch keine Lösung.Antworten:
Der wahrscheinlich beste Weg ist, die nachfolgenden Leerzeichen zu verarbeiten, wenn Sie Ihre Datendatei lesen. Wenn Sie verwenden
read.csv
oderread.table
den Parameter einstellen könnenstrip.white=TRUE
.Wenn Sie Zeichenfolgen anschließend bereinigen möchten, können Sie eine der folgenden Funktionen verwenden:
So verwenden Sie eine dieser Funktionen für
myDummy$country
:Um das Leerzeichen anzuzeigen, können Sie Folgendes verwenden:
Hier werden die Zeichenfolgen angezeigt, die von Anführungszeichen (") umgeben sind, sodass Leerzeichen leichter zu erkennen sind.
quelle
str_trim
imstringr
Paket.Ab R 3.2.0 wurde eine neue Funktion zum Entfernen führender / nachfolgender Leerzeichen eingeführt:
Siehe: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
quelle
\n
sie in der abgedeckten Zeichenklasse sind.trimws("SELECT\n blah\n FROM foo;")
enthält noch Zeilenumbrüche.trimws
Regex schnell genug.stringr::str_trim
(basierend aufstringi
) ist auch insofern interessant, als es eine völlig unabhängige internationalisierte String-Bibliothek verwendet. Sie würden denken, Whitespace wäre immun gegen Probleme mit der Internationalisierung, aber ich frage mich. Ich habe noch nie einen Vergleich der Ergebnisse von nativen undstringr
/stringi
oder Benchmarks gesehen.trimws()
entfernte meine führenden Leerzeichen nicht, während Bryanstrim.strings()
unten (nur 1 Stimme, meine!) ...Verwenden Sie str_trim () im stringr-Paket, um den Leerraum zu bearbeiten. Das Paket hat ein Handbuch vom 15. Februar 2013 und ist in CRAN. Die Funktion kann auch Zeichenfolgenvektoren verarbeiten.
(Gutschrift geht an Kommentator: R. Cotton)
quelle
trimws()
die nicht entfernt werden konnten.Eine einfache Funktion zum Entfernen von führenden und nachfolgenden Leerzeichen:
Verwendungszweck:
quelle
ad1) Um Leerzeichen zu sehen, können Sie direkt
print.data.frame
mit geänderten Argumenten aufrufen :Siehe auch
?print.data.frame
für andere Optionen.quelle
Verwenden Sie grep oder grepl, um Beobachtungen mit Leerzeichen zu finden, und sub, um sie zu entfernen.
quelle
"^\\s+|\\s+$"
gsub
stattsub
mit Hadleys Regexp verwenden muss. Damitsub
wirdIch 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 Funktion trim () aus dem gdata-Paket erreicht werden:
Anwendungsbeispiel:
quelle
Ein weiteres verwandtes Problem tritt auf, wenn zwischen den Eingaben mehrere Leerzeichen stehen:
Sie können diese Zeichenfolge dann einfach in "echte" Token aufteilen, indem Sie einen regulären Ausdruck für das
split
Argument verwenden:Beachten Sie, dass bei einer Übereinstimmung am Anfang einer (nicht leeren) Zeichenfolge das erste Element der Ausgabe "" "ist. Wenn jedoch am Ende der Zeichenfolge eine Übereinstimmung vorliegt, ist die Ausgabe dieselbe wie mit dem Streichholz entfernt.
quelle
Eine andere Option ist die Verwendung der
stri_trim
Funktion aus demstringi
Paket, die standardmäßig führende und nachfolgende Leerzeichen entfernt:Verwenden Sie zum Entfernen nur führender Leerzeichen
stri_trim_left
. Verwenden Sie, um nur nachgestellte Leerzeichen zu entfernenstri_trim_right
. Wenn Sie andere führende oder nachfolgende Zeichen entfernen möchten, müssen Sie dies mit angebenpattern =
.Siehe auch
?stri_trim
für weitere Informationen.quelle
Ich habe eine
trim.strings ()
Funktion zum Trimmen von führenden und / oder nachfolgenden Leerzeichen wie folgt erstellt:Zur Veranschaulichung:
quelle
Beste Methode ist trimws ()
Der folgende Code wendet diese Funktion auf den gesamten Datenrahmen an
quelle
df[] <- lapply(df, trimws)
kompakter sein. In beiden Fällen werden Spalten jedoch zum Zeichen gezwungen.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
sicher sein.Ich habe versucht, trim (). Funktioniert gut mit Leerzeichen sowie dem '\ n'. x = '\ n Harden, J. \ n'
trimmen (x)
quelle
Danach müssen Sie R zwingen, "Österreich" nicht als Level zu erkennen. Stellen wir uns vor, Sie haben auch "USA" und "Spanien" als Level:
Ein bisschen weniger einschüchternd als die Antwort mit der höchsten Stimme, aber es sollte trotzdem funktionieren.
quelle