Dank des Kommentars von 42 ist es mir gelungen, eine Funktion zum Umcodieren der Datei zu schreiben:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
return(df)
}
Das Fleisch hier ist der Befehl Encoding(df[, col]) <- "latin1"
, die Spalte col
benötigt des Datenrahmens df
und konvertiert es in das latin1-Format. Leider Encoding
Nimmt nur Spaltenobjekte als Eingabe, also musste ich eine Funktion erstellen, um alle Spalten eines Datenrahmenobjekts zu durchsuchen und die Transformation anzuwenden.
Wenn sich Ihr Problem natürlich nur auf ein paar Spalten bezieht, ist es besser, einfach den Encoding
anzuwenden zu diesen Spalten anstelle des gesamten Datenrahmens (Sie können die obige Funktion ändern, um eine Reihe von Spalten als Eingabe zu verwenden). Auch wenn Sie mit dem umgekehrten Problem konfrontiert sind, d. h. ein in Linux oder Mac OS erstelltes R-Objekt in Windows einzulesen, sollten Sie originalEncoding = "UTF-8"
verwenden .
Vielen Dank, dass Sie dies gepostet haben. Ich habe mir die Freiheit genommen, Ihre Funktion zu ändern, falls Sie einen Datenrahmen mit einigen Spalten als Zeichen und einigen als Nicht-Zeichen haben. Andernfalls tritt ein Fehler auf:
> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
a character vector argument expected
Hier ist also die modifizierte Funktion:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols)
if(class(df[, col]) == "character"){
Encoding(df[, col]) <- originalEncoding
}
return(df)
}
Dies ändert jedoch nicht die Kodierung der Ebenennamen in einer "Faktor"-Spalte. Glücklicherweise habe ich festgestellt, dass dies alle Faktoren in Ihrem Datenrahmen in Zeichen umwandelt (was vielleicht nicht der beste Ansatz ist, aber in meinem Fall war es das, was ich brauchte):
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
In Anlehnung an frühere Antworten ist dies ein kleines Update, mit dem es an Faktoren und dplyr's Tibble funktioniert. Danke für die Inspiration.
fix.encoding <- function(df, originalEncoding = "UTF-8") {
numCols <- ncol(df)
df <- data.frame(df)
for (col in 1:numCols)
{
if(class(df[, col]) == "character"){
Encoding(df[, col]) <- originalEncoding
}
if(class(df[, col]) == "factor"){
Encoding(levels(df[, col])) <- originalEncoding
}
}
return(as_data_frame(df))
}