2015-12-01 17 views
5

Linux (UTF-8) makinemde okumak için bir .RData dosyam var, ancak dosyanın Latince1 olduğunu biliyorum çünkü bunları Windows'ta kendim yarattım. Maalesef, orijinal dosyalara veya bir Windows makinesine erişimim yok ve bu dosyaları Linux makinemde okumam gerekiyor.Farklı kodlamayla Rdata dosyasını okuma

Bir Rdata dosyasını okumak için normal prosedür load("file.Rdata")'u çalıştırmaktır. read.csv gibi işlevler, bu tür sorunları çözmek için kullanabileceğiniz bir encoding bağımsız değişkenine sahiptir, ancak load böyle bir şeye sahip değildir.

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

Başka ne yapabilirim: Ben load("file.Rdata", encoding = latin1) çalışırsanız, sadece bu (beklenen) hatası alıyorum? Dosyalarım, bir UTF-8 ortamında açıldığında bozulan aksanları içeren metin değişkenleriyle yüklenir. 42 yorumuna

+2

RData dosyalarında kodlama yok. Seri hale getirilmiş Rdata'yı yüklemeniz ve ardından R çalışma alanındayken değerleri yeniden kodlamanız gerekir. Eğer '? Kodlama 'okuduktan sonra bu durum belirsiz kalırsa, yükü yapın ve' dput (head (object))' çıkışını yayınlayın. –

+0

@ 42, bu sorunu çözmek için görünüyor, görünüşe göre ben de veri çerçevemdeki her vektöre 'Kodlama (x)' uygulamak gerekir. Daha iyi bir göz atacağım ve size geri döneceğim. –

+0

Çalışma alanındaki adları yükten önce ve sonra kaydedebilir ve ardından karakter değerleri olan öğeler için fark üzerinde çalışabilirsiniz. –

cevap

3

sayesinde, dosyayı tekrar kodlamak için bir işlev yazmak için idare ettik:

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

burada et dataframe df sütununu col alır ve biçimini latin1 dönüştürür komut Encoding(df[, col]) <- "latin1" olduğu . Ne yazık ki, Encoding sadece sütun nesnelerini girdi olarak alır, bu yüzden bir dataframe nesnesinin tüm sütunlarını taramak ve dönüşümü uygulamak için bir işlev oluşturmak zorunda kaldım.

Elbette, sorun yalnızca birkaç sütun içeriyorsa, Encoding'u tüm veri çerçevesinin yerine bu sütunlara uygulamaktan daha iyi olursunuz (yukarıdaki gibi bir sütun kümesini giriş olarak değiştirmek için işlevi değiştirebilirsiniz)). Ayrıca, ters problemle karşı karşıyaysanız, yani Linux veya Mac OS'de Windows'a oluşturulan bir R nesnesini okuyorsanız, originalEncoding = "UTF-8"'u kullanmalısınız.

1

Bunu gönderdiğiniz için teşekkür ederiz. Karakter olarak bazı sütunlar ve bazı karakter olmayan karakterler içeren bir veri çerçeveniz varsa, işlevinizi değiştirmek için özgürlüğü aldım. Aksi takdirde, bir hata oluşur:

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

Ancak bu bir "faktör" sütunundaki düzeyin isimlerin kodlamasını değişmez:

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

modifiye fonksiyonudur. Neyse ki, bu karaktere doğru dataframe tüm faktörleri değiştirmek bulundu (değil en iyi yaklaşım olabilir ama benim durumumda ne gerekli olduğunu): Bir önceki cevapları takip etmek

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

, bu reşit Hangi faktörler ve dplyr'ın tibble üzerinde çalışır hale getirir. İlham için teşekkürler.

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)) 
} 
İlgili konular