Mam pewne problemy z prowadzeniem i kończeniem białych znaków w ramce data.frame. Np. Lubię przyjrzeć się konkretnemu row
w data.frame
oparciu o pewien warunek:
> 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)
Zastanawiałem się, dlaczego nie uzyskałem oczekiwanej produkcji, skoro Austria oczywiście istniała w moim kraju data.frame
. Po przejrzeniu historii kodu i próbie ustalenia, co poszło nie tak, próbowałem:
> 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
Wszystko, co zmieniłem w poleceniu, to dodatkowe białe znaki po Austrii.
Oczywiście powstają dalsze irytujące problemy. Np. Kiedy chcę scalić dwie ramki na podstawie kolumny kraju. Jedna data.frame
używa, "Austria "
a druga ma "Austria"
. Dopasowywanie nie działa.
- Czy istnieje dobry sposób na „pokazanie” białych znaków na ekranie, aby zdawać sobie sprawę z problemu?
- Czy mogę usunąć wiodące i końcowe białe znaki w R?
Do tej pory pisałem prosty Perl
skrypt, który usuwa białe spacje, ale byłoby miło, gdybym mógł jakoś to zrobić wewnątrz R.
sub()
używa równieżPerl
notacji. Przepraszam za to. Spróbuję użyć tej funkcji. Ale na moje pierwsze pytanie nie mam jeszcze rozwiązania.Odpowiedzi:
Prawdopodobnie najlepszym sposobem jest obsługa końcowych białych znaków podczas odczytywania pliku danych. Jeśli używasz
read.csv
lubread.table
możesz ustawić parametrstrip.white=TRUE
.Jeśli chcesz później wyczyścić ciągi, możesz użyć jednej z następujących funkcji:
Aby użyć jednej z tych funkcji w
myDummy$country
:Aby „pokazać” białe znaki, których możesz użyć:
który pokaże ciągi otoczone znakami cudzysłowu („), dzięki czemu łatwiej będzie dostrzec białe spacje.
źródło
str_trim
wstringr
pakiecie.Począwszy od wersji 3.2.0 wprowadzono nową funkcję usuwania wiodących / końcowych białych znaków:
Zobacz: http://stat.ethz.ch/R-manual/R-pched/library/base/html/trimws.html
źródło
\n
że należy do klasy znaków objętych.trimws("SELECT\n blah\n FROM foo;")
wciąż zawiera nowe linie.trimws
regex jest wystarczająco szybki.stringr::str_trim
(oparty nastringi
) jest również interesujący, ponieważ wykorzystuje całkowicie niezależną międzynarodową bibliotekę ciągów. Można by pomyśleć, że białe znaki będą odporne na problemy z internacjonalizacją, ale zastanawiam się. Nigdy nie widziałem porównania wyników natywnych vsstringr
/stringi
lub jakichkolwiek testów porównawczych.trimws()
nietrim.strings()
Aby manipulować białą spacją, użyj str_trim () w pakiecie stringr. Podręcznik ma datę 15 lutego 2013 r. I jest w wersji CRAN. Funkcja może również obsługiwać wektory łańcuchowe.
(podziękowania dla komentatora: R. Cotton)
źródło
trimws()
nie można było usunąć.Prosta funkcja usuwania początkowych i końcowych białych znaków:
Stosowanie:
źródło
ad1) Aby zobaczyć białe spacje, możesz bezpośrednio wywołać
print.data.frame
zmodyfikowane argumenty:Zobacz także
?print.data.frame
inne opcje.źródło
Użyj grep lub grepl, aby znaleźć obserwacje z białymi spacjami i sub, aby się ich pozbyć.
źródło
"^\\s+|\\s+$"
gsub
zamiastsub
wyrażenia regularnego Hadleya. Dziękisub
niemu znikną końcowe białe znaki tylko wtedy, gdy nie będzie wiodących białych znaków ...Wolałbym dodać odpowiedź jako komentarz do użytkownika 56, ale nie mogę tego napisać jako niezależnej odpowiedzi. Usunięcie początkowych i końcowych spacji można również osiągnąć za pomocą funkcji trim () z pakietu gdata:
Przykład użycia:
źródło
Kolejny powiązany problem występuje, jeśli między wejściami jest wiele spacji:
Następnie możesz łatwo podzielić ten ciąg na „rzeczywiste” tokeny, używając wyrażenia regularnego do
split
argumentu:Zauważ, że jeśli istnieje dopasowanie na początku (niepustego) ciągu, pierwszym elementem wyniku jest „” „”, ale jeśli istnieje dopasowanie na końcu łańcucha, wynik jest taki sam jak z usuniętym dopasowaniem.
źródło
Inną opcją jest użycie
stri_trim
funkcji zstringi
pakietu, która domyślnie usuwa początkowe i końcowe białe znaki:Aby usunąć tylko wiodące białe znaki, użyj
stri_trim_left
. Aby usunąć tylko końcowe białe znaki, użyjstri_trim_right
. Jeśli chcesz usunąć inne wiodące lub końcowe znaki, musisz to określić za pomocąpattern =
.Zobacz także,
?stri_trim
aby uzyskać więcej informacji.źródło
Utworzyłem
trim.strings ()
funkcję przycinania początkowych i / lub końcowych białych znaków jako:Dla ilustracji
źródło
Najlepszą metodą jest trimws ()
Poniższy kod zastosuje tę funkcję do całej ramki danych
źródło
df[] <- lapply(df, trimws)
być bardziej kompaktowym. Ale w obu przypadkach wymusi kolumny do postaci.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
być bezpiecznym.Próbowałem trim (). Działa dobrze z białymi spacjami oraz „\ n”. x = '\ n Harden, J. \ n'
wykończenie (x)
źródło
Następnie musisz zmusić R, aby nie rozpoznawał „Austrii” jako poziomu. Udawajmy, że masz również poziomy „USA” i „Hiszpania”:
Trochę mniej onieśmielające niż najwyższa głosowana odpowiedź, ale powinno nadal działać.
źródło