2015-12-01 3 views
5

У меня есть файл .RData для чтения на моем компьютере Linux (UTF-8), но я знаю, что файл находится на латинице1, потому что я создал их самостоятельно в Windows. К сожалению, у меня нет доступа к исходным файлам или Windows-машине, и мне нужно прочитать эти файлы на моей машине Linux.Чтение файла Rdata с различной кодировкой

Чтобы прочитать файл Rdata, обычной процедурой является запуск load("file.Rdata"). Функции, такие как read.csv, имеют аргумент encoding, который вы можете использовать для решения таких проблем, но load не имеет такой вещи. Если я пытаюсь load("file.Rdata", encoding = latin1), я просто получить это (ожидаемое) сообщение об ошибке:

Error in load("file.Rdata", encoding = "latin1") : unused argument (encoding = "latin1")

Что еще я могу сделать? Мои файлы загружаются текстовыми переменными, содержащими акценты, которые повреждаются при открытии в среде UTF-8.

+2

Файлы RData не имеют кодировок. Вам необходимо загрузить сериализованную Rdata, а затем повторно закодировать значения, когда они находятся внутри рабочего пространства R. Если это неясно, прочитав «Кодирование», выполните загрузку и опубликуйте вывод 'dput (head (object))'. –

+0

@ 42, это, кажется, решает проблему, слишком плохо, по-видимому, мне нужно применить «Кодирование (x)» к каждому вектору в моем фреймворке данных. Я лучше посмотрю на него и вернусь к вам. –

+0

Вы можете записывать имена в рабочей области до и после загрузки, а затем работать с разницей для элементов, имеющих знаковые значения. –

ответ

3

Благодаря 42 в комментарии, я успел написать функцию перекодировки файла:

fix.encoding <- function(df, originalEncoding = "latin1") { 
    numCols <- ncol(df) 
    for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding 
    return(df) 
} 

Мясо здесь команда Encoding(df[, col]) <- "latin1", которая принимает столбец col из dataframe df и преобразует его в latin1 формат , К сожалению, Encoding принимает только объекты столбца в качестве входных данных, поэтому мне пришлось создать функцию для прокрутки всех столбцов объекта dataframe и применить преобразование.

Конечно, если ваша проблема состоит всего в нескольких столбцах, вам лучше просто применить Encoding к этим столбцам, а не ко всей области данных (вы можете изменить вышеприведенную функцию, чтобы взять набор столбцов в качестве входных данных). Кроме того, если вы столкнулись с обратной проблемой, то есть прочитав объект R, созданный в Linux или Mac OS, в Windows, вы должны использовать originalEncoding = "UTF-8".

1

Благодарим вас за сообщение. Я взял на себя смелость изменить вашу функцию, если у вас есть фреймворк данных с некоторыми столбцами в качестве символа, а некоторые - как несимвольные. В противном случае возникает ошибка:

> fix.encoding(adress) 
Error in `Encoding<-`(`*tmp*`, value = "latin1") : 
a character vector argument expected 

Так вот модифицированная функция:

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) 
} 

Однако, это не изменит кодировку имен уровня в колонке «фактор». К счастью, я нашел это изменить все факторы в вашем dataframe к характеру (которые могут быть не лучший подход, но в моем случае это то, что мне было нужно):

i <- sapply(df, is.factor) 
df[i] <- lapply(df[i], as.character) 
1

следующие на предыдущих ответов, это незначительное обновление, которое заставляет его работать над факторами и доблестью dplyr. Спасибо за вдохновение.

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)) 
} 
Смежные вопросы