Ich habe eine Reihe von csv
Dateien, die ich in R einlese und die in einem Paket- / Datenordner im .rdata
Format enthalten sind. Leider bestehen die Nicht-ASCII-Zeichen in den Daten die Prüfung nicht. Das tools
Paket hat zwei Funktionen, um nach Nicht-ASCII-Zeichen ( showNonASCII
und showNonASCIIfile
) zu suchen, aber ich kann anscheinend keine finden, um sie zu entfernen / zu bereinigen.
Bevor ich mich mit anderen UNIX-Tools befasse, wäre es großartig, dies alles in R zu tun, damit ich einen vollständigen Workflow von den Rohdaten bis zum Endprodukt aufrechterhalten kann. Gibt es vorhandene Pakete / Funktionen, mit denen ich die Nicht-ASCII-Zeichen entfernen kann?
r
unicode
ascii
non-ascii-characters
Maiasaura
quelle
quelle
read.csv()
einencoding
Argument erfordert, sodass Sie damit umgehen können, zumindest in R? Welche spezifische Prüfung schlagen die Nicht-ASCII-Zeichen fehl, ist sie in R (wenn ja, hier posten) oder extern?Antworten:
Um die Nicht-ASCII-Zeichen einfach zu entfernen , können Sie die
iconv()
Einstellung Basis-R verwendensub = ""
. So etwas sollte funktionieren:x <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher") # e.g. from ?iconv Encoding(x) <- "latin1" # (just to make sure) x # [1] "Ekstrøm" "Jöreskog" "bißchen Zürcher" iconv(x, "latin1", "ASCII", sub="") # [1] "Ekstrm" "Jreskog" "bichen Zrcher"
Um lokalisieren Nicht-ASCII - Zeichen, oder zu finden , wenn es in Ihren Dateien überhaupt war, könnten Sie die folgenden Ideen wahrscheinlich anpassen:
## Do *any* lines contain non-ASCII characters? any(grepl("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII"))) [1] TRUE ## Find which lines (e.g. read in by readLines()) contain non-ASCII characters grep("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII")) [1] 1 2 3
quelle
Heutzutage ist es etwas besser, das Stringi-Paket zu verwenden, das eine Funktion für die allgemeine Unicode-Konvertierung bietet. Auf diese Weise können Sie den Originaltext so weit wie möglich beibehalten:
x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher") x #> [1] "Ekstrøm" "Jöreskog" "bißchen Zürcher" stringi::stri_trans_general(x, "latin-ascii") #> [1] "Ekstrom" "Joreskog" "bisschen Zurcher"
quelle
iconv("Klinik. der Univ. zu K_ln (AA\u0090R)","latin1","ASCII",sub="") => [1] "Klinik. der Univ. zu K_ln (AAR)"
butstringi::stri_trans_general("Klinik. der Univ. zu K_ln (AA\u0090R)", "latin-ascii") => [1] "Klinik. der Univ. zu K_ln (AA\u0090R)"
stringi::stri_trans_general(x, "latin-ascii")
Entfernt einige der Nicht-ASCII-Zeichen in meinem Text, andere jedoch nicht.tools::showNonASCII
Die nicht entfernten Zeichen sind: Leerzeichen mit der Breite Null, Markenzeichen, Eurozeichen, schmales Leerzeichen. Bedeutet dies, dass"latin-ascii"
die falsche Transformationskennung für meine Zeichenfolge ist? Gibt es eine einfache Möglichkeit, die richtige Transformationskennung herauszufinden? DankeUm alle Wörter mit Nicht-ASCII-Zeichen zu entfernen (Code von @Hadley ausleihen), können Sie das Paket
xfun
mitfilter
from verwendendplyr
x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher", "alex") x x %>% tibble(name = .) %>% filter(xfun::is_ascii(name)== T)
quelle