Berkat komentar 42, saya berhasil menulis fungsi untuk mengode ulang file:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
return(df)
}
Daging disini adalah perintah Encoding(df[, col]) <- "latin1"
, yang mengambil kolom col
kerangka data df
dan mengubahnya menjadi format latin1. Sayangnya, Encoding
hanya mengambil objek kolom sebagai input, jadi saya harus membuat fungsi untuk menyapu semua kolom objek kerangka data dan menerapkan transformasi.
Tentu saja, jika masalah Anda hanya pada beberapa kolom, lebih baik Anda menerapkan Encoding
saja ke kolom tersebut alih-alih seluruh kerangka data (Anda dapat memodifikasi fungsi di atas untuk mengambil satu set kolom sebagai input). Juga, jika Anda menghadapi masalah terbalik, yaitu membaca objek R yang dibuat di Linux atau Mac OS ke Windows, Anda harus menggunakan originalEncoding = "UTF-8"
.
Terima kasih telah memposting ini. Saya mengambil kebebasan untuk memodifikasi fungsi Anda jika Anda memiliki kerangka data dengan beberapa kolom sebagai karakter dan beberapa sebagai non-karakter. Jika tidak, terjadi kesalahan:
> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
a character vector argument expected
Jadi inilah fungsi yang dimodifikasi:
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)
}
Namun, ini tidak akan mengubah pengkodean nama level di kolom "faktor". Untungnya, saya menemukan ini untuk mengubah semua faktor dalam kerangka data Anda menjadi karakter (yang mungkin bukan pendekatan terbaik, tetapi dalam kasus saya itulah yang saya butuhkan):
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
menindaklanjuti jawaban sebelumnya, ini adalah pembaruan kecil yang membuatnya berfungsi pada faktor dan tibble dplyr. Terima kasih untuk inspirasi.
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))
}